2016-03-02 14 views
4
import subprocess 

child = subprocess.Popen(['python', 'simple.py'], stdin=subprocess.PIPE) 
child.communicate('Alice') 

我知道通過溝通 你如何檢查腳本「simple.py」是否要求用戶輸入您可以執行腳本交流?蟒子:檢查是否執行的腳本要求用戶輸入

simple.py可能會要求5-10個用戶輸入,所以只需簡單地使用硬編碼communicate就足夠了。

[編輯]:要分析的標準輸出作爲腳本運行並傳送回給腳本

while True: 
    if child.get_stdout() == '?': 
     # send user input 
+0

你不能。程序不要求輸入;他們等着。 – zondo

+0

我怎麼知道他們是否在等待....(問/等)我沒有看到區別 – ealeon

+0

你只是不能。當它在等待輸入時,它只是在獲得它之前什麼也不做。無所事事有很多原因,因此無法知道它是否在等待輸入。 – zondo

回答

1

一個簡單的例子:

simple.py:

i = raw_input("what is your name\n") 
print(i) 
j = raw_input("What is your age\n") 
print(j) 

讀寫:

import subprocess 

child = subprocess.Popen(['python2', 'simple.py'], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 

for line in iter(child.stdout.readline, ""): 
    print(line) 
    if "name" in line: 
     child.stdin.write("foo\n") 
    elif "age" in line: 
     child.stdin.write("100\n") 

輸出:

what is your name 

foo 

What is your age 

100 
+1

謝謝!這是我正在尋找的 – ealeon

+0

@ealeon:當心,除非你確切地知道你應該寫/讀多少;如果輸入/輸出不同步,掛起子進程是非常容易的(如果您嘗試讀取太多;您可能無限期地等待輸入永遠不會到來,或者如果您嘗試儘快寫入太多因爲相應的OS管道緩衝區已滿,「寫入」可能會被阻止)。一般來說,你應該使用線程或異步。 I/O如果您正在處理多個管道(如本例中那樣)。 – jfs

相關問題