J'ai le code suivant qui tente de démarrer chacune des "commandes" ci-dessous sous Linux. Le module tente de garder chacune des 2 commandes en cours d'exécution si l'une ou l'autre devait planter pour une raison quelconque.
#!/usr/bin/env python
import subprocess
commands = [ ["screen -dmS RealmD top"], ["screen -DmS RealmD top -d 5"] ]
programs = [ subprocess.Popen(c) for c in commands ]
while True:
for i in range(len(programs)):
if programs[i].returncode is None:
continue # still running
else:
# restart this one
programs[i]= subprocess.Popen(commands[i])
time.sleep(1.0)
Lors de l'exécution du code, l'exception suivante est levée:
Traceback (most recent call last):
File "./marp.py", line 82, in <module>
programs = [ subprocess.Popen(c) for c in commands ]
File "/usr/lib/python2.6/subprocess.py", line 595, in __init__
errread, errwrite)
File "/usr/lib/python2.6/subprocess.py", line 1092, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory
Je pense qu'il me manque quelque chose d'évident. Quelqu'un peut-il voir ce qui ne va pas avec le code ci-dessus?
Utilisez ["screen", "-dmS", "RealmD", "top"]
au lieu de ["screen -dmS RealmD top"]
.
Peut-être aussi utiliser le chemin complet vers screen
.
Si le programme ne peut toujours pas être trouvé, vous pouvez également consulter votre shell avec Shell=True
, mais vous devez ensuite citer et échapper à vos paramètres, etc. Assurez-vous de lire les informations dans la documentation si vous envisagez de le faire.
La seule chose à faire est de ne pas trouver screen
. Essayez /usr/bin/screen
ou tout ce que which screen
vous donnera.
Le problème est que votre commande doit être divisée. sous-processus nécessite que le cmd soit une liste et non une chaîne . Il ne devrait pas être:
subprocess.call('''awk 'BEGIN {FS="\t";OFS="\n"} {a[$1]=a [$1] OFS $2 FS $3 FS $4} END
{for (i in a) {print i a[i]}}' 2_lcsorted.txt > 2_locus_2.txt''')
Ça ne marchera pas. Si vous alimentez une chaîne en sous-traitement, cela suppose que c'est le chemin d'accès à la commande que vous voulez exécuter. La commande doit être une liste. Consultez http://www.gossamer-threads.com/lists/python/python/724330 . De plus, comme vous utilisez la redirection de fichiers, vous devez utiliser subprocess.call(cmd, Shell=True)
. Vous pouvez également utiliser shlex
.
commands = [ "screen -dmS RealmD top", "screen -DmS RealmD top -d 5" ]
programs = [ subprocess.Popen(c.split()) for c in commands ]
Juste au cas où .. J'ai également été coincé avec cette erreur et le problème était que mes fichiers étaient sous DOS au lieu de UNIX, donc à:
return subprocess.call(lst_exp)
où lst_exp est une liste d'arguments, l'un d'eux était "introuvable" car il était sous DOS au lieu d'UNIX mais l'erreur renvoyée était la même:
File "/var/www/run_verifier.py", line 59, in main
return subprocess.call(lst_exp)
File "/usr/lib/python2.7/subprocess.py", line 522, in call
return Popen(*popenargs, **kwargs).wait()
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1335, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory