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 passtderr
? - 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é
Vous devez vous connecter pour publier un commentaire.
Pour obtenir tous stdout comme une chaîne de caractères:
À obtenir à la fois la sortie standard stdout et stderr comme une seule chaîne:
Pour obtenir toutes les lignes de la liste:
D'obtenir des lignes comme ils sont imprimés par le processus secondaire:
Ajouter
stderr=STDOUT
à laPopen()
appel à la fusion stdout/stderr.Remarque: si
cmd
utilise le bloc-mémoire tampon dans le mode non-interactif, puis les lignes n'apparaissent pas jusqu'à ce que le tampon de bouffées de chaleur.winpexpect
module pourrait être en mesure d'obtenir la sortie plus tôt.Enregistrer la sortie dans un fichier:
Si
cmd
nécessite toujours l'entrée même vide; ensemblestdin
:Vous pouvez combiner ces solutions, par exemple, de fusionner stdout/stderr, et d'enregistrer la sortie dans un fichier, et de fournir une entrée vide:
Pour fournir l'entrée de tous comme une seule chaîne que vous pourriez utiliser
.communicate()
méthode:où
test.py
:Si votre interaction avec le programme ressemble plus à une conversation que vous pourriez avoir besoin
winpexpect
module. Voici un exemple depexpect
docs:Pour envoyer les touches spéciales comme
F3
,F10
sur Windows, vous pourriez avoir besoinSendKeys
module ou son pur Python de la mise en œuvreSendKeys-ctypes
. Quelque chose comme:Il n'est pas sortie de capture.
from subprocess import check_output as qx
Ce n'qx
stand for?x
exécuter,q
citation: origine ` backquotes en bash,qx''
opérateur en perl.stderr=STDOUT
comme indiqué dans le 2ème exemple? Ce sont ces deux lignes manquantes quelque chose comme invites de mot de passe (celui-ci peut être écrite directement sur la console (à l'extérieur stdout, stderr))? Voulez-vous fournir toutes les entrées à la fois et de lire l'ensemble de la sortie du programme ou de l'interaction plus une conversation (aller et retour)? Quelle est la taille de l'entrée/sortie? mise à Jour de votre question avec l'info. Vous pouvez laisser un commentaire si vous voulez que je sois informé.?
lorsque vous modifiez une question)). Décrire en anglais de la façon dont vous interagissez avecDvb_pid.exe
lorsque vous démarrez manuellement à partir d'une console. EstDvb_pid.exe
un utilitaire de ligne de commande ou il ouvre sa propre fenêtre lorsque vous démarrez à partir d'cmd.exe
fenêtre? Ce qui d'entrée est-il attendre?stdout_text
oustderr_text
? Essayez d'expérimenter avec des combinaisons deuniversal_newlines=True
,universal_newlines=False
et la suppression de\n
ou de la remplacer par\r\n
. Ne vous pressez juste1
quand il affiche l'invite de commande ou avez-vous appuyez sur1
puisEnter
lorsque vous exécutez manuellement? Ne vous appuyez sur rien d'autre jusqu'à ce que le programme se termine?.communicate
(il peut ne pas lire son entrée dans le tuyau fourni parsubprocess
module)? Sur le code de la python-forum.org de: ne pas utiliserp.stdin.write
,p.stdout.read
directement, sauf si vous savez ce que vous faites.None
temporairement pour voir si le menu de navigation fonctionne via.communicate("1\n2\n")
. Bien qu'il ne va pas aider avec F3,F10 question. Pouvez-vous naviguer dans le menu en utilisant uniquement les caractères imprimables?stdin=PIPE
?) . Pour être clair aucun des exemples dans ma réponse peut passer les touches de fonction (F*) sur Windows.stdin=PIPE
alors vous avez besoin de Windows configuration spécifique. J'ai ajoutéSendKeys
exemple à la réponse. Avez-vous essayéwinpexpect
?raise.CalledProcessError(retcode,process.args,output=output")
...returned non-zero exit status 2
dans mon exemple. De toute façon à empêcher que les et toujours capturer la sortie de l'écran?subprocess.check_output()
: spectacle de sortie en cas d'échec. Si quelque chose est difficile de poser une nouvelle question StackOverflowL'indentation de votre question m'a jeté un peu, depuis le Python est particulier à ce sujet. Avez-vous essayé quelque chose comme ça:
Je pense que
stdout
sera une chaîne unique de ce que vous revenez de votre commande, si cela peut ne pas être ce que vous désirez, depuisreadline()
suppose que vous voulez afficher la sortie ligne par ligne.Suggère de fouiller http://docs.python.org/library/subprocess.html pour certains usages qui correspondent à ce que vous êtes jusqu'à.