Votre problème ici est que vous essayez de contrôler une application interactive.
stdout.read()
continuera à lire jusqu'à ce qu'il ait atteint la fin du flux, du fichier ou du canal. Malheureusement, dans le cas d'un programme interactif, le tuyau n'est fermé que lorsque le programme se termine; ce qui n'est jamais, si la commande que vous avez envoyée était autre que "quit"
.
Vous devrez revenir à lire la sortie du sous-processus ligne par ligne en utilisant stdout.readline()
, et vous feriez mieux d'avoir un moyen de dire quand le programme est prêt à accepter une commande, et quand la commande que vous avez émise au programme est terminé et vous pouvez en fournir un nouveau. Dans le cas d'un programme comme cmd.exe
, même readline()
ne suffira pas car la ligne qui indique qu'une nouvelle commande peut être envoyée n'est pas terminée par une nouvelle ligne, donc devra analyser la sortie octet par octet. Voici un exemple de script qui va cmd.exe
, cherche l'invite, puis émet un dir
puis un exit
: Si le timing est pas important, et l'interactivité pour un utilisateur n'est pas nécessaire
from subprocess import *
import re
class InteractiveCommand:
def __init__(self, process, prompt):
self.process = process
self.prompt = prompt
self.output = ""
self.wait_for_prompt()
def wait_for_prompt(self):
while not self.prompt.search(self.output):
c = self.process.stdout.read(1)
if c == "":
break
self.output += c
# Now we're at a prompt; clear the output buffer and return its contents
tmp = self.output
self.output = ""
return tmp
def command(self, command):
self.process.stdin.write(command + "\n")
return self.wait_for_prompt()
p = Popen(["cmd.exe"], stdin=PIPE, stdout=PIPE)
prompt = re.compile(r"^C:\\.*>", re.M)
cmd = InteractiveCommand(p, prompt)
listing = cmd.command("dir")
cmd.command("exit")
print listing
, il peut être beaucoup plus simple juste pour recharger les appels:
from subprocess import *
p = Popen(["cmd.exe"], stdin=PIPE, stdout=PIPE)
p.stdin.write("dir\n")
p.stdin.write("exit\n")
print p.stdout.read()
Votre code semble correct. Est-ce que la console_app fonctionne bien lorsque vous exécutez à partir de la console? Que retourne-t-il pour command1? – luc
yes console_app fonctionne normalement lors de l'exécution dans cmd.exe Il sort juste quelques chiffres en fonction de l'entrée fournie (et parfois des chaînes) – QAZ