2014-09-30 58 views
0

我有一個程序,myshell.exe,我需要通過python(發送命令,並讀取結果)交互。有一個.exe運行在後臺,並通過蟒蛇輸入的東西到

美中不足的是,我只能運行myshell.exe一次(不能封閉POPEN和環型通信)

我試圖popenpopen.communicate()但似乎運行myshell.exe,送我的命令,然後退出的過程。

# settin up the command 
p = Popen("myshell.exe", stdout=PIPE, stdin=PIPE, stderr=PIPE, shell=True) 

# sending something (and getting output) 
print p.communicate("run"); 

此時,從打印輸出I可以看到,我的myshell.exe已退出(ⅰ具有被打印的再見消息)。

任何想法,如果有任何解決方法嗎? 謝謝。

+0

好吧,只需將「Popen」部分留在循環之外:打開一次通信,根據需要進行多次交互。 – 2014-09-30 12:40:56

回答

1

正如您可以在Popen.communicate文檔中看到的那樣,它將在返回之前等到myshell.exe退出。

使用p.stdoutp.stdin與過程,而不是溝通:

p.stdin.write("run") 
print p.stdout.read(1024) 

p.stdinp.stdout是普通的文件對象。你可以讀寫它們在一個循環中,只留下外面p = Popen(...)部分:

p = Popen("myshell.exe", stdout=PIPE, stdin=PIPE, stderr=PIPE, shell=True) 
for i in range(3): 
    p.stdin.write("run") 
    print p.stdout.read(16) 
p.terminate() 

此假設你指望myshell.exe的行爲(如不退出發送第一個命令之後)。

+0

如果我從Windows終端運行myshell.exe,myshell.exe表現正常,即如果我輸入以下順序運行\ n,它將執行運行,然後等待下一個命令。我想溝通()發送EOF或類似的東西,搞砸了myshell.exe – user2599522 2014-09-30 12:32:33

+1

你可能不得不在命令後添加尾隨的'\ n'或'\ r \ n',例如。 'p.stdin.write(「run \ n」)'如果'myshell.exe'在命令後面(如任何交互式shell所做的那樣)期望返回。 – 2014-09-30 12:36:42

+0

我認爲就是這樣。當使用'p.stdin.write(「run」)'時,'myshell.exe'會退出。但是,如果我發送'p.stdin.write(「run \ r \ n」)',那麼我可以繼續發送內容。 – user2599522 2014-09-30 12:53:00