2011-06-14 73 views
0

這裏有兩個(相關的?)問題。當Popen調用並寫入標準輸入時Python出現奇怪的行爲

我試圖編寫一個程序來啓動一個外部進程,然後simultani從stdout中讀取並寫入到stdin。一切似乎都在工作,但是這個過程並沒有響應發送到它的stdin管道的數據。你知道爲什麼會這樣嗎?(1)

第二個問題現在就解決了。

我寫了兩個測試腳本,第一次是這樣:

# recv.py 
while True: 
    print(input()) 

第二個被設計用popen來調用其他的給它一些任意的輸入:

# send.py 
recv = subprocess.Popen(["python", "recv.py"], stdin=subprocess.PIPE) 
recv.stdin.write(b"Hello\n") 
recv.stdin.write(b"World.\n") 

這是我得到了什麼,當我跑它:

[email protected]:testing$ python send.py 
[email protected]:testing$ Traceback (most recent call last): 
    File "recv.py", line 30, in <module> 
    main() 
    File "recv.py", line 26, in main 
    print(input()) 
    File "<string>", line 1, in <module> 
NameError: name 'Hello' is not defined 

它看起來像whatev呃理由input()的結果被視爲線的一部分,而不是字符串,事實上當我在recv.py中設置變量Hello時,它打印的內容爲Hello。爲什麼會發生這種情況?(2)

我在Mac OSX上運行python 3.1.2。

+0

也許爲了鼓勵對(1)的回答,你應該提供一個更清晰的代碼描述 - 也許有特定的例子。 – chisaipete 2011-06-15 00:07:42

回答

3

你看到什麼是Python 2.x中的input()功能,這需要從sys.stdin(如raw_input())的線,然後評估它作爲Python代碼的預期行爲。在Python 2.x中使用input()通常是一個糟糕的主意:)在Python 3.x中,input()已被刪除,並且raw_input()被重命名爲input(),這可能是您爲什麼會對其功能感到困惑的原因。

即使您已安裝它,您仍未執行Python 3.x。 python命令可能(希望!)仍然是系統安裝的Python 2.x.嘗試使用python3python3.1代替運行。

+0

你知道嗎,我敢打賭'python'是我的'.profile'中的一個別名,我們可以假設'Popen'沒有遵循我的別名。 – Violet 2011-06-14 23:34:02

2

請確定您的實際上是運行Python 3?這看起來很像Python 2.x input()行爲,它將輸入解釋爲Python表達式(而不是raw_input(),它變成了Python 3的input())。

+1

d'oh,'python'是'python3.1'的別名,但Popen不會跟隨該別名。 – Violet 2011-06-14 23:35:22

相關問題