2017-10-08 47 views
1

我編寫了一個程序(myProg.py),它使用子進程模塊通過運行函數運行其他python程序。我注意到這些其他python程序中的輸入(arg)語句中的arg沒有顯示到控制檯(stdout),而print(args)中的args顯示正確。這隻發生在我通過控制檯運行我的程序時。當我通過LiClipse運行我的程序時,不會發生這種情況。python subprocess.run with stderr = subprocess.PIPE重定向輸入(文本)

這裏是複製這種情況下,最簡單的方法:

使用Python 3.6.2和Windows 10

  1. 創建一個Python程序包含以下兩行並保存爲someProgram.py:

a = input("Enter anything") print("a has: " + a)

  1. 開放CMD,類型:蟒
  2. 類型:進口子
  3. 類型:subprocess.run([ 「蟒」, 「path..to..someProgram.py」],標準錯誤= subprocess.PIPE)
  4. 否ouptut到目前爲止,解釋器正在等待輸入......鍵入內容並按Enter鍵。
  5. 您將看到print語句的輸出。

如果刪除stderr = subprocess.PIPE,您將看到正確的輸出。

現在,將步驟2 & 3中的代碼保存到另一個文件中,在與someProgram.py相同的文件夾中將其命名爲myProg.py。從LiClipse運行myProg.py。你會發現myProg.py運行正常,併產生正確的輸出。

我的問題是:

  1. 爲什麼這個問題subprocess.run發生
  2. 我怎樣才能解決這個問題
  3. 爲什麼會有通過命令行,並通過IDE運行的代碼之間的差異。

回答

1

input功能打印prompt text to stderr,這是一個known issue

您重定向stderr,因此提示文本沒有顯示,當你從LiClipse運行,標準錯誤不是重定向。

您可以輸出提示你的自我,像:

print("Enter anything", end='') 
a = input() 

另外,inputimport readline模塊,然後input將使用GNU readline LIB(如果有),打印到標準輸出。雖然在你的情況下,程序作爲一個子進程運行,你仍然可以實現這一點:

python -c "import readline; import runpy; runpy.run_path('/path/to/program.py')" 
+0

感謝您指出錯誤報告。我正在使用Windows,所以我將不得不下載並使用pyreadline。您是否知道另一個與操作系統無關的解決方法? –

+0

或者,您可以自己打印提示標準輸出,更新。 – georgexsh

+0

感謝georgexsh。不幸的是,這不符合我的要求。 –