38 votes

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 que je manque quelque chose d'évident, quelqu'un peut-il voir ce qui ne va pas avec le code ci-dessus?

66voto

sth Points 91594

Utilisez ["screen", "-dmS", "RealmD", "top"] au lieu de ["screen -dmS RealmD top"] .

Peut-être aussi utiliser le chemin complet vers screen .

Si le programme est toujours introuvable, vous pouvez également parcourir 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 prévoyez de le faire. .

9voto

Colin Burnett Points 4572

Je suppose seulement qu'il ne peut pas trouver screen . Essayez /usr/bin/screen ou tout ce que which screen vous donne.

7voto

kirbyfan64sos Points 1656

Le problème, c'est que votre commande doit être split. subprocces exige que le cmd est une liste, pas une chaîne de caractères. Il Shoudn pas:

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''') 

Cela ne marchera pas. Si vous nourrissez un sous-processus de la chaîne, il suppose que c'est le chemin d'accès à la commande que vous souhaitez exécuter. La commande doit être une liste. Découvrez http://www.gossamer-threads.com/lists/python/python/724330. Aussi, parce que vous êtes en utilisant un fichier de redirection, vous devez utiliser subprocess.call(cmd, shell=True). Vous pouvez également utiliser shlex.

2voto

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X