Je suis aux prises avec les concepts derrière les sous-processus et les tuyaux, et je travaille avec eux dans un contexte Python. Si quelqu'un pouvait éclaircir ces questions, cela m'aiderait vraiment.Avez-vous réfléchi à l'utilisation de tuyaux et de sous-processus en Python?
Dire que j'ai un pipeline mis en place comme suit
createText.py | processText.py | cat
processText.py reçoit des données par stdin, mais comment cela est mis en œuvre? Comment sait-il que plus aucune donnée ne viendra et qu'elle devrait sortir? Je suppose qu'il pourrait chercher un EOF et se terminer en fonction de cela, mais que se passe-t-il si createText.py n'en envoie jamais? Serait-ce considéré comme une erreur sur la partie de createText.py?
Dites parent.py démarre un sous-processus enfant (child.py) et appelle wait() pour attendre la fin de l'enfant. Si parent capture stdout et stderr de l'enfant en tant que tuyaux, est-il toujours possible de les lire après la fin de l'enfant? Ou est-ce que les tuyaux (et les données qu'ils contiennent) sont détruits quand une extrémité se termine?
Le problème général que je veux résoudre est d'écrire un script python qui appelle plusieurs fois rsync avec la classe Popen. Je veux que mon programme attende jusqu'à ce que rsync ait fini, alors je veux vérifier l'état de retour pour voir s'il s'est terminé correctement. Si ce n'est pas le cas, je veux lire le fichier stderr de l'enfant pour voir quelle est l'erreur. Voici ce que j'ai jusqu'à présent
# makes the rsync call. Will block until the child # process is finished. Returns the exit code for rsync def performRsync(src, dest): print "Pushing " + src + " to " + dest child = Popen(['rsync', '-av', src, dest], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) child.wait() ## check for success or failure ## 0 is a successful exit code here if not child.returncode: return True else:#ballz stout, sterr = child.communicate() print "ERR pushing " + src + ". " + sterr return False
Mise à jour: J'ai également rencontré ce problème. Tenez compte de ces deux fichiers simples:
# createText.py for x in range(1000): print "creating line " + str(x) time.sleep(1) # processText.py while True: line = sys.stdin.readline() if not line: break; print "I modified " + line
Pourquoi processText.py dans ce cas ne démarre pas l'impression qu'il obtient des données à partir de stdin? Est-ce qu'un tuyau collecte une quantité de données tamponnées avant de le transmettre?
Si le tuyau est fermé correctement, vous verrez un EOF. Sinon, vous obtiendrez une erreur de tuyau cassée. – Amber
Merci pour le commentaire. Donc, dans l'exemple ci-dessus, quand createText.py se ferme après l'impression d'un texte, est-ce que le simple fait qu'il se termine cause la fermeture de son tube stdout? –