2016-07-05 110 views
0

爲什麼「subprocess.Popen.stdin.write」命令看起來失敗?寫入subprocess.Popen.stdin不能正確執行

#!/usr/bin/env python3 
# coding=utf-8 
import os 
import subprocess 

bash = subprocess.Popen(['bash'], 
    stdout=subprocess.PIPE, stdin=subprocess.PIPE, 
    stderr=subprocess.PIPE, shell=True) 

(殼=真:見編輯2)

bash.stdin.write(b'echo foo\n') 
print(bash.stdout.readline()) 
bash.stdin.write(b'echo bar\n') 
print(bash.stdout.readline()) 

編輯:它會阻止在第一subprocess.Popen.stdout.readline(),可能是因爲在subprocess.Popen沒有線.stdout。它應該打印出來:

foo 
bar 

編輯2:這仍然掛起。

+0

您是否收到任何錯誤訊息?它做什麼和它應該做什麼? – Adam

+0

它不會這樣做。 bash有許多執行模式,你要找的是shell模式。你可以做的是在調用'Popen'時執行'shell = True',但是你會創建一個安全漏洞。你應該檢查文檔:https://docs.python.org/2/library/subprocess.html – HuStmpHrrr

+0

你會做什麼bash?顯然它看起來對我很有用,就像這樣,因爲當它在shell模式下啓動時,你的bash會打印其中的一些內容。另一個解決方案是'ptty',它更正確但更復雜。如果你想做正確的事情,你也會想檢查一下。 – HuStmpHrrr

回答

0

只要你運行GNU/Linux(也許別人,還沒有測試過)並安裝pexpect(「pip install pexpect」),我的問題就可以解決這個問題。

#!/usr/bin/env python3 
# coding=utf-8 
""" 
Python command line software control example 
""" 
import pexpect 

encode = 'UTF-8' 

bash = pexpect.spawn('/usr/bin/env bash', encoding=encode) 

bash.sendline('echo foo') 
print(bash.readline()) 
bash.sendline('echo bar') 
print(bash.readline())