J'ai un drapeau dans mon script Python qui spécifie si je configure et utilise un processus externe ou non. Ce processus est une commande appelée Je veux utiliser un script python pour générer des lignes de données code> en modifiant Entrée standard et l'alimentation sur Je fais quelque chose comme ceci: p> Toutefois, edit strong> p> Disons que mon script Python s'appelle mais maintenant je passe C'est à je veux Si j'utilisais my_command code> et prend des données à partir d'une entrée standard. Si je devais courir ceci sur la ligne de commande, ce serait quelque chose comme:
MY_COMMAND CODE>. p>
my_command code> se comporte comme s'il ne reçoit aucune donnée et quitte avec un état d'erreur. Qu'est-ce que je fais mal? P>
my_pytHon_script code>. Disons que je passerais normalement
my_command code> un fichier appelé
data code> sur une entrée standard: p>
my_python_script code> à la place: p>
my_python_script code> pour configurer de manière conditionnelle un sous-processus qui fonctionne
My_Command < / Code> sur le contenu de
DATA CODE> (qui sont modifiés par
my_python_script code> avant d'être passé sur
My_Command code>). Cela a-t-il plus de sens? P>
bash code> comme langage de script, je déciderais de lancer l'une des deux fonctions. On pourrait pipeler des lignes de données sur
my_command code>. L'autre ne serait pas. Peut-il être fait avec python? P> p>
3 Réponses :
On dirait que vous pouviez être déroutant des arguments et des stdin. Votre commande doit être avec les données étant transmises une fois la commande appelée. P> prenant une entrée est effectuée avec la fonction Raw_Input Code> . ( http://docs.python.org/2/library/fonctions.htmlled/a >) p> p>
Je ne comprends pas. J'essaie de transmettre my_command code> modifié des données à partir du script, ne pas avoir le type d'utilisateur final dans les données manuellement via le terminal. Tout doit être traité dans le script. Cela a-t-il plus de sens?
@Alexreynolds Si vous tapez à la coquille. Comment passeriez-vous dans plusieurs lignes d'entrée comme argument à une commande? Je pense que vous êtes des arguments déroutants (c.-à-d.: La commande arg1 arg2 arg2 code>) et stdin (c.-à-d .:
(echo arg1; echo arg2; echo arg3) | commande code>. Vous devez expliquer lequel est-ce que tu veux
Je pense que la confusion est que si vous appelez $ python name_of_script.py
sys.argv code>.
Si j'utilise $ my_python_script résultat code> sans tous les code> Subgrocess code> Stuff, il gère une entrée standard et une sortie juste bien, donc je ne pense pas que les arguments de fichier soient le problème ici . En fait, si je laissez la redirection, alors le
pour code> la boucle est suspendu, en attente de l'entrée standard. J'essaie simplement de comprendre comment incorporer une instance de processus de
sous-processus code> dans ce script.
@Alexreynolds, cette commande est-elle équivalente à celle que vous avez fournie? Données CAT | my_python_script> résultat code>. Juste pour nettoyer la confusion.
Après avoir écrit à la STDIN, vous devez le fermer:
for ... process.stdin.write(modified_line) process.stdin.close() process.wait()
Cela jette une exception code> ValueError code> sur la seconde passe via le pour code> boucle:
ValueError: Opération d'E / S sur fichier fermé code>. La commande
my_command code> traite plusieurs lignes (en réalité, elle imite une application spécifique d'unix
trier code>) afin que la poignée STDIN doit rester ouverte, je pense.
Pouvez-vous fermer après la boucle? Ma faute.
En plus de processus.stdin.close () code> comme mentionné par @haivi, avez-vous fait
processus.wait () code> pour attendre la fin de la commande avant d'avoir le résultat? p>
J'ai oublié processus.wait () code>. Bonne prise.
Quel type de fichier est
my_command code>? Est-ce un script shell? Script Python? Vous voudrez peut-être essayer quelque chose comme ['/ bin / bash', 'my_command'] i> ou quelque chose de similaire pour le script Python.
Vous pouvez écrire
my_python_script code> en tant que filtre UNIX à la place. Ensuite, le script python ne sait rien sur
my_command code> et lit simplement à partir de STDIN, la modifie en quelque sorte, et s'imprime sur stdout: ` quelque_other_result
Si
stdout = tuyau code>, vous devriez le lire, sinon le processus pourrait bloquer s'il génère suffisamment de sortie.
Un exemple simple de communication à double sens entre un processus primaire et une sous-processus peut être trouvé ici: Stackoverflow.com/a/52841475/1349673 < / a>