Comment puis-je obtenir la totalité de la production de mon .exe à l'aide de sous-processus et Popen?

Je suis en train de lancer un exécutable de capture et de sa sortie à l'aide d' subprocess.Popen; cependant, je ne semble pas être obtenir la totalité de la production.

import subprocess as s
from subprocess import Popen 
import os

ps = Popen(r'C:\Tools\Dvb_pid_3_0.exe', stdin = s.PIPE,stdout = s.PIPE)
print 'pOpen done..'

while:

line = ps.stdout.readline()
print line

Il imprime deux ligne de moins que l'original exe fichier lors de l'ouverture manuellement.

J'ai essayé une autre approche avec le même résultat:

f = open('myprogram_output.txt','w')
proc = Popen('C:\Tools\Dvb_pid_3_0.exe ', stdout =f)

line = proc.stdout.readline()
print line
f.close()

Quelqu'un peut-il m'aider à obtenir l'ensemble des données de l'exe?

, Comme demandé par Sebastian:

Original fichier exe dernières lignes o/p:

-Gdd : Générique nombre (de 1 à 1000)

-Cdd : Couper à partir de (0 - 99)
-Edd : Couper fin à (1 - 100)

Veuillez sélectionner le fichier de flux numéro ci-dessous:

1 - .\pdsx100-bcm7230-squashfs-sdk0.0.0.38-0.2.6.0-prod.sao.ts

L'o/p-je obtenir après l'exécution:

-P0xYYYY      : Pid been interested                                          

-S0xYYYY : ID du Service intéressé

-T0xYYYY : Transport ID intéressé

-N0xYYYY : ID du Réseau intéressé

-R0xYYYY : Un vieux Pid été remplacé par ce PID

-Gdd : Générique nombre (de 1 à 1000)

De sorte que nous pouvons voir quelques lignes manquantes. Je dois écrire 1 et sélectionnez la valeur après veuillez sélectionner la fule numéro ci-dessous s'affiche.

J'ai essayé d'utiliser le ps.stdin.write('1\n'). Il n'a pas d'impression de la valeur dans le fichier exe

Nouveau code:

#!/usr/bin/env python
from subprocess import Popen, PIPE

cmd = r'C:\Tools\Dvb_pid_3_0.exe'
p = Popen(cmd, stdin=PIPE, stdout=None, stderr=None, universal_newlines=True)
stdout_text, stderr_text = p.communicate(input="1\n\n")

print("stdout: %r\nstderr: %r" % (stdout_text, stderr_text))
if p.returncode != 0:
    raise RuntimeError("%r failed, status code %d" % (cmd, p.returncode))

Merci Sébastien. Je suis capable de voir l'ensemble de la production, mais pas en mesure de nourrir quelque d'entrée avec le code actuel.

  • Ce sont les deux lignes en question? Êtes-vous sûr qu'ils vont envoyer à stdout et pas stderr ?
  • Faute de frappe dans votre premier exemple, indentation après la while, ou votre code est vraiment comme ça?
  • Oui faute de frappe c'est en vrai: lors de l'édition, il a été retiré
InformationsquelleAutor Ajith | 2012-09-26