web-dev-qa-db-fra.com

Python OSError: [Errno 2]

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?

36
Caedis

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.

65
sth

La seule chose à faire est de ne pas trouver screen. Essayez /usr/bin/screen ou tout ce que which screen vous donnera.

9
Colin Burnett

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.

7
kirbyfan64sos
commands = [ "screen -dmS RealmD top", "screen -DmS RealmD top -d 5" ]
programs = [ subprocess.Popen(c.split()) for c in commands ]
2
Dennis Williamson

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
0
Delphine