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.
Essayez d’ajouter un paramètre supplémentaire «Shell = True» à l’appel Popen
.
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.
Vous devez donner le chemin complet à votre programme deactivate
et ensuite le module de sous-processus devrait pouvoir le trouver.
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.