2017-08-07 5 views
0

J'ai testé le stderr avec le module de sous-processus. Si j'écris un test simple avec shell = True avec la commande shell linux ls typé intentionnellement mauvais:python: stderr avec shell = True ou shell = False dans le module de sous-processus

p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True) 
out, err=p.communicate() 
print ("standard error") 
print(err) 

il sort habituel de la coquille: lr: command not found.

Mais si shell=False, je ne comprends pas pourquoi le programme a une erreur exécution je pensais que

Traceback (most recent call last): 
    File "importInteresantes.py", line 6, in <module> 
     p=subprocess.Popen(["lr"],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) 
    File "/usr/lib/python2.7/subprocess.py", line 390, in __init__ 
errread, errwrite) 
    File "/usr/lib/python2.7/subprocess.py", line 1024, in _execute_child 
raise child_exception 
OSError: [Errno 2] No such file or directory 

il me donnerait la même sortie. Est-ce que le code est faux ou est le point de vue que je devrais obtenir le même stderr?

NOTE: Juste au cas où j'ai aussi essayé avec python3

+0

Les mécanismes utilisés pour lancer la commande sont très différents dans les deux cas. Pourquoi attendez-vous exactement que le diagnostic d'erreur soit identique? – NPE

+0

"lr: commande non trouvée" était un message d'erreur shell. Si vous n'utilisez pas de shell, vous n'avez pas de shell pour afficher les messages d'erreur du shell. – jasonharper

+0

Mais ce que je m'attends à ce que le programme fonctionne au moins, puis une erreur apparaît. Pas que ça ne puisse pas fonctionner du tout. Donc vous ne pouvez pas savoir pour les cas que je tape une mauvaise commande avec python? J'ai également entendu que l'utilisation de 'shell = True' peut être risquée –

Répondre

1

Avec shell=True, Python lance un shell et indique au shell pour exécuter lr. Le shell s'exécute très bien, ne parvient pas à trouver un programme lr et produit une sortie d'erreur signalant cet échec.

Avec shell=False, Python tente d'exécuter lr directement. Comme il n'y a pas de programme lr à exécuter, Python ne peut pas trouver un fichier exécutable correspondant à lr. Python ne peut pas lancer le sous-processus, et il n'y a pas de flux stdout ou stderr à lire. Python déclenche une exception signalant son échec à trouver le fichier.

Ce comportement est normal et attendu.

+0

Ok, à la fin, je suppose que l'erreur dans le programme le rend toujours inexécutable. Merci pour les réponses –