web-dev-qa-db-fra.com

Erreur Popen: [Errno 2] Aucun fichier ou répertoire de ce type

J'ai des commandes personnalisées.

# works 
subprocess.Popen(['python'], stdout=subprocess.PIPE)

Mais si j'ai mes propres commandes système telles que deactivate, j'obtiens cette erreur

Traceback (most recent call last):
  File "runner2.py", line 21, in <module>
    main() 
  File "runner2.py", line 18, in main
    subprocess.Popen(['deactivate',], stdout=subprocess.PIPE)
  File "/usr/lib/python2.6/subprocess.py", line 633, in __init__
    errread, errwrite)
  File "/usr/lib/python2.6/subprocess.py", line 1139, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Laissez seul je dois exécuter ceci sous mon sandbox virtualenv. 

39
user1012451

Essayez d’ajouter un paramètre supplémentaire «Shell = True» à l’appel Popen

93
Anthony Kong

Juste une note. Shell=True était probablement la solution correcte pour le fichier o.p., car ils n'ont pas commis l'erreur suivante, mais vous pouvez également obtenir l'erreur "Aucun fichier ou répertoire de ce type" si vous ne séparez pas votre exécutable de ses arguments.

import subprocess as sp, shlex
sp.Popen(['echo 1']) # FAILS with "No such file or directory"
sp.Popen(['echo', '1']) # SUCCEEDS
sp.Popen(['echo 1'], Shell=True) # SUCCEEDS, but extra overhead
sp.Popen(shlex.split('echo 1')) # SUCCEEDS, equivalent to #2

Sans Shell=True, Popen s'attend à ce que l'exécutable soit le premier élément de args. C'est pourquoi il échoue. Il n'y a pas d'exécutable "echo 1". L'ajout de Shell=True appelle votre shell système et transmet le premier élément de args au shell. c'est-à-dire que, pour linux, Popen(['echo 1'], Shell=True) est équivalent à Popen('/bin/sh', '-c', 'echo 1'), ce qui représente plus de temps système que nécessaire. Voir Documentation Popen () pour les cas où Shell=True est réellement utile.

29
Mark Woodward

Vous devez donner le chemin complet à votre programme deactivate et ensuite le module de sous-processus devrait pouvoir le trouver.

3
Senthil Kumaran

Je crée des sous-processus comme celui-ci:

SHUTDOWN_CMD = os.path.sep.join(["c:", "windows", "system32", "shutdown.exe"])

def abortShutdown():
    os.spawnv(os.P_NOWAIT, SHUTDOWN_CMD,
        [SHUTDOWN_CMD, '/A'])
    time.sleep(3)

Je n'utilise pas de sous-processus car Python 2.5 ne le supporte pas. J'ai dû utiliser le chemin complet pour le faire fonctionner et je suppose que vous devez également utiliser le chemin complet de vos commandes personnalisées.

0
katzenversteher