Python Exécuter un démon sous-processus & lire stdout
J'ai besoin d'exécuter un programme et de recueillir sa sortie sur stdout. Ce programme (socat) doit s'exécuter en arrière-plan pendant la durée du script python. Socat se trouve dans dameon mode une fois qu'il est exécuté, mais d'abord il affiche des lignes à la sortie standard stdout que j'ai besoin pour le reste de mon script.
Commande: socat -d -d PTY: PTY:
De sortie:
2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/1
2011/03/23 21:12:35 socat[7476] N PTY is /dev/pts/2
2011/03/23 21:12:35 socat[7476] N starting data transfer loop with FDs [3,3] and [5,5]
...
En gros, je veux courir qu'au début de mon programme et de le laisser tourner jusqu'à la fin du script, mais j'ai besoin de lire les deux /dev/pts/X les noms en python.
Quelqu'un peut me dire comment faire cela?
Je suis venu avec ce qui vient de se bloque, j'imagine, parce que c'est bloquant pour la fin du processus enfant.
#!/usr/bin/python
from subprocess import Popen, PIPE, STDOUT
cmd = 'socat -d -d PTY: PTY: &'
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
output = p.stdout.read()
# Process the output
print(output)
Merci pour toute aide
EDIT: il Semble qu'il peut écrire sur la sortie stderr, mais le scénario reste tout hanges avec et sans le & même la lecture de stderr.
&
?Nan 🙁 Malheureusement ce n'est pas, il se bloque.
Avez-vous essayé d'ajouter dans une instruction print pour vérifier que c'est le blocage suite à votre appel à
Popen
et pas de blocage sur la read()
appel?Ne socat produire beaucoup de sortie, ou juste quelques lignes?
OriginalL'auteur Jason | 2011-03-23
Vous devez vous connecter pour publier un commentaire.
Il y a deux problèmes avec votre version. Tout d'abord, vous appelez la fonction de lecture sans argument qui signifie qu'il va tenter de tout lire. Mais depuis socat n'est pas arrêter, il ne décide jamais qu'il a tout lu. En utilisant readline, python ne lit jusqu'à ce qu'il trouve un retour à la ligne. De ma compréhension de ton problème, qu'est ce que vous avez besoin.
Le deuxième problème est que la bibliothèque standard C sera tampon sorties sur des tuyaux. Nous avons à résoudre que par la création d'un pty avec le openpty() de la fonction et de le transmettre à la fois la sortie standard stdout et stderr de la sous-processus. Nous utilisons la fonction de faire de ce descripteur de fichier en un objet python et nous nous débarrassons de la mise en mémoire tampon.
Je ne sais pas ce que vous faites avec le socat, mais je me demande s'il serait remplacé par l'aide de la pty module. La copie d'un pty à l'autre, et openpty est la création d'une paire de pty-s. Peut-être vous pouvez les utiliser directement?
C'était un épargnant de vie!
OriginalL'auteur Winston Ewert
Le processus secondaire, probablement, ne ferme jamais la sortie standard, de sorte que le
read()
appel attend toujours. Pour aggraver les choses, il sera probablement tampon de sa sortie quand il découvre que c'est une pipe à la place d'une console (la bibliothèque standard C est ce que fait automatiquement, donc ce n'est pas une fonction de la façon dont habilement écrites, l'application est). Si oui, probablement la seule option est d'utiliser une attendre bibliothèque de style comme Pexpect.OriginalL'auteur Marcelo Cantos
Si vous nous les fournissez avec un tuyau de stdout et stderr, je pense que le sous-processus va bloquer en attente pour les tuyaux pour être lu. .read() devrait se lire à l'EOF, je pense. Entre eux, ces deux questions pro fait un blocage.
Cependant, je pense que depuis .read() va lire jusqu'expressions du FOLKLORE, il bloque même si il n'y a pas de stderr pipe.
Vous voulez coller à la lecture d'un fil de discussion, je pense.
OriginalL'auteur Bittrance