2017-09-26 29 views
1

J'ai une fonctionnalité dans laquelle je dois exécuter une commande dans un script python. D'une autre réponse, j'ai pensé que call from subprocess module est le moyen le plus sûr. Mais, je suis incapable de travailler à travers cela. J'utilise Python 2.7Exécution de subprocess.call à partir d'un script python

Ceci est une version plus petite de ce que je suis en train:

import subprocess 
a = "echo hello" 
subprocess.call([a]) 

Il me donne l'erreur suivante:

subprocess.call([a]) 
    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 1327, in _execute_child 
    raise child_exception 
OSError: [Errno 2] No such file or directory 

Je ne peux pas comprendre pourquoi!

Répondre

1

Vous pouvez passer les commandes en tant que chaîne ou une liste mais pas comme une chaîne dans une liste, sinon le système tente de lancer le processus echo hello (qui n'existe pas, de toute évidence, ce qui explique le message d'erreur OSError: [Errno 2] No such file or directory). Le transmettre en tant que chaîne nécessite shell=True sur certains systèmes.

Et shell=True est également nécessaire avec du shell-ins comme la commande echo (qui a un non intégré dans la version en /bin sur certains systèmes, pour ajouter à la confusion)

import subprocess 
subprocess.call(["echo","hello"],shell=True) 

Pour les non construits -Dans commandes (je suppose que echo est juste un test ici), éviter shell=True, car il ajoute une couche enveloppe inutile qui dégrade les performances de démarrage, et est sujette à l'injection de code (echo hello; rm -rf everything_on_disk)

pour lancer votre éditeur favori, par exemple, tu peux faire:

subprocess.call(["emacs","readme.txt"]) 
+0

Salut, juste une question de suivi: Je veux écrire une chaîne src dans un fichier. Alors, c'est comme ça que je devrais le faire? inputFile = "nameInput" c1 = ["echo", src, ">>", fichierEntrée] call (c1, shell = True) – Tarun

+0

Les questions de suivi ne sont pas vraiment sur le sujet ici, mais cochez celle-ci il répond parfaitement: https://stackoverflow.com/questions/4965159/python-how-to-redirect-output-with-subprocess –

+0

ya, je voulais juste être sûr si ce que j'ai compris était correct. Merci :) – Tarun

1

Le code que vous avez écrit a des problèmes, subprocess.call prend dans une liste où le premier élément de la liste est la commande. Dans votre cas, c'est echo et hello est votre argument, il devrait être la prochaine valeur dans la liste. Donc, votre code devrait ressembler à ceci.

import subprocess 

a = [ "echo","hello"] 
subprocess.call(a)