web-dev-qa-db-fra.com

Python: exécution du script Shell avec des arguments (variable), mais l'argument n'est pas lu dans le script Shell

J'essaie d'exécuter un script Shell (pas une commande) à partir de python:

main.py
-------
from subprocess import Popen

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],Shell=True)

execute.sh
----------

echo $1 //does not print anything
echo $2 //does not print anything

var1 et var2 sont des chaînes que j'utilise comme entrée pour le script Shell. Suis-je en train de manquer quelque chose ou existe-t-il une autre façon de le faire?

Référé: Comment utiliser le sous-processus popen Python

15
creativeDrive

Le problème est avec Shell=True. Supprimez cet argument ou passez tous les arguments sous forme de chaîne, comme suit:

Process=Popen('./childdir/execute.sh %s %s' % (str(var1),str(var2),), Shell=True)

Le shell ne transmettra au processus que les arguments que vous fournissez dans le 1er argument de Popen, tout comme l'interprétation des arguments lui-même. Voir une réponse à une question similaire ici. Ce qui se passe réellement, c'est que votre script Shell ne reçoit aucun argument, donc $ 1 et $ 2 sont vides.

Popen héritera de stdout et stderr du script python, donc il n'est généralement pas nécessaire de fournir le stdin= et stderr= arguments à Popen (sauf si vous exécutez le script avec une redirection de sortie, telle que >). Vous ne devez le faire que si vous avez besoin de lire la sortie à l'intérieur du script python, et de le manipuler d'une manière ou d'une autre.

Si tout ce dont vous avez besoin est d'obtenir la sortie (et cela ne vous dérange pas de fonctionner de manière synchrone), je vous recommande d'essayer check_output, car il est plus facile d'obtenir la sortie que Popen:

output = subprocess.check_output(['./childdir/execute.sh',str(var1),str(var2)])
print(output)

Remarquerez que check_output et check_call ont les mêmes règles pour les Shell= argument comme Popen.

17
micromoses

vous envoyez en fait les arguments ... si votre script Shell a écrit un fichier au lieu de l'imprimer, vous le verrez. vous devez communiquer pour voir votre sortie imprimée du script ...

from subprocess import Popen,PIPE

Process=Popen(['./childdir/execute.sh',str(var1),str(var2)],Shell=True,stdin=PIPE,stderr=PIPE)
print Process.communicate() #now you should see your output
3
Joran Beasley