2013-02-17 11 views
0

J'essaie d'obtenir les dernières lignes N d'un objet Popen.stdout illimité à l'heure actuelle. Et par illimité, je veux dire illimité/plusieurs entrées de journal qui sont écrites sur stdout. J'ai essayé Popen.stdout.readline() limité par le temps, mais cela produit beaucoup de problèmes aléatoires, surtout avec peu de sortie. Une sorte d'instantané de la sortie actuelle m'aiderait, mais je suis incapable de trouver quelque chose comme ça. Toutes les solutions que je trouve principalement sont pour des processus externes qui se terminent, mais le mien est une application serveur qui devrait être capable d'écrire sur stdout après avoir lu les dernières lignes.Comment obtenir les N dernières lignes d'un objet Popen.stdout illimité

Salutations,

Faerbit

+0

Peut-être exagéré, même si c'est une bibliothèque simple: je recommanderais 'pexpect' pour ce travail. Au moins, il résout des problèmes comme le sous-programme qui met en mémoire tampon toute une page de données car sa sortie standard ne semble pas être un terminal. –

+0

Je ne sais pas comment cela m'aiderait. Il semble avoir les mêmes méthodes de lecture que Popen. (Aussi, leur page Web est très étrange.) – Faerbit

+0

Pouvez-vous donner un exemple plus clair de ce que vous entendez par «illimité» Popen? Est-ce que c'est comme si vous aviez un sous-processus Popen comme un serveur web qui crache constamment des entrées de journal et que vous voulez en obtenir N lignes comme et quand vous voulez dans le processus principal de contrôle? – sotapme

Répondre

0

Sur Unix, lorsque vous lancez votre processus, vous pouvez diriger dans tail premier:

p=subprocess.Popen("your_process.sh | tail --lines=3", stdout=subprocess.PIPE, shell=True) 
r=p.communicate() 
print r[0] 

Utilisation de shell=True est la clé ici.

+0

Cela ne fonctionne pas parce que vous avez manqué le problème clé: La sortie est illimitée! queue ainsi que communiquer() travailler uniquement sur les processus qui se terminent. Sur les journaux du serveur, cela ne fonctionne pas, car votre serveur devrait fonctionner tout le temps. – Faerbit

+0

Quelle est la dernière ligne N? –

+0

Considérons la sortie de tee en cours dans un fichier et l'exécution périodique de 'tail' sur ce fichier. Si la sortie va déjà dans le fichier journal, vous pouvez 'tail' le fichier journal –

Questions connexes