上面的代碼存在許多問題。主要問題可能是您的listname
應該是一個字符串(如果test
不包含字符串),並且您的第二個Popen
調用的語法是錯誤的(每個參數應該是它自己的列表條目)。
另外,如果您需要使用第二個進程sudo
,則還有一些額外的問題,具體取決於您是否需要添加密碼。
因此,取決於如何處理這些問題,你的代碼可能看起來像下面的選項之一:
from subprocess import Popen, PIPE
listname = 'test'
b = '/tmp/{}.txt'.format(listname)
c = '/tmp/{}.conf'.format(listname)
first = Popen(['/bin/cat', b], stdout=PIPE)
# Alt 1, No sudo
second = Popen(['/usr/share/logstash/bin/logstash', '-f', c], stdin=first.stdout)
# Alt 2, sudo with no password
second = Popen(['sudo', '/usr/share/logstash/bin/logstash', '-f', c], stdin=first.stdout)
# Alt 3, add sudo password (most complex)
# Alt 3.1, store password in file (bad)
sudo_password = "clear_text_password"
#Alt 3.2, ask user for password:
from getpass import getpass, getuser
sudo_password = getpass("[sudo] password for {}: ".format(getuser()))
# Since we need to add password at stdin, we cannot directly pipe output from "first"
# instead we set stdin to PIPE, and write sudo password, followed by output from "first"
# sudo -kSp '' ensures that password is read from stdin without prompt being displayed
second = Popen(['sudo', '-kSp', '', '/usr/share/logstash/bin/logstash', '-f', c], stdin=PIPE)
second.stdin.write(sudo_password + '\n') # write password
# followed by output from "first".
for line in first.stdout:
second.stdin.write(line)
second.stdin.close()
希望這將有助於你找到一個合適的解決方案。如果沒有,請進一步說明您的問題。
謝謝,作品真的很好:) 使用Alt 2的作品,但第二個過程並沒有結束,我應該使用.communicate來結束這個?我試過: output = second.communicate()[0] 無濟於事。 –
「不結束」是什麼意思?它在過程列表中顯示爲''(執行'ps')?在這種情況下,它已經結束,可以通過'del second'來刪除(你也可能想做'del first')。如果一個進程被取消引用,python將確保它被垃圾回收。如果該過程仍在運行,我想它正在等待更多輸入? –
JohanL