2015-04-02 65 views
1

作爲一個例子,這裏就是我試過:從python3腳本中,如何將一個字符串輸入到bash程序中?

#!/usr/bin/env python3 

from subprocess import Popen 

message = "Lo! I am up on an ox." 
Popen('less', shell=True).communicate(input=message) 

隨着最後一行,我也試過:

Popen('less', stdin=message, shell=True) 

我能做什麼,我想:

Popen('echo "%s" | less' % message, shell=True) 

有沒有更pythonic的做法呢?

謝謝!

回答

1
import subprocess 
p = subprocess.Popen('less', shell=True, stdout = subprocess.PIPE, stdin = subprocess.PIPE) 
p.stdin.write('hey!!!'.encode('utf-8')) 
print(p.communicate()) 

您可以設置一個PIPE通信與過程

+0

這裏你不需要'p.stdin.write()'。如果OPs語言環境使用不同的編碼,則'utf-8'錯誤。我沒有看到在問題中重定向stdout的要求。在針對初學者的答案中不要使用'shell = True'。 OP可能不知道'shell = True'不是必需的,甚至是有害的,但回答子進程問題的人應該知道更好的 – jfs 2015-04-03 18:40:07

2

@hyades上面的回答肯定是正確的,這取決於你想可能是最好的到底是什麼,但你的第二個例子沒理由工作是因爲stdin的值必須像文件一樣(就像unix一樣)。以下內容也適用於我。

with tempfile.TemporaryFile(mode="w") as f: 
    f.write(message) 
    f.seek(0) 
    Popen("less", stdin=f) 
+0

,你應該使用'r +'模式打開文件(儘管它在我的Ubuntu機器上工作)。 – jfs 2015-04-03 18:43:35

1

這足以補充stdin=subprocess.PIPE(對孩子的標準輸入重定向)作爲@hyades suggesteduniversal_newlines=True(啓用文本模式),以你的代碼,以字符串傳遞給子進程:

#!/usr/bin/env python 
from subprocess import Popen, PIPE 

message = "Lo! I am up on an ox." 
Popen(['cat'], stdin=PIPE, 
     universal_newlines=True).communicate(input=message) 

除非你有理由,否則不要使用shell=True

+0

這個解決了字符串到字節的問題,另一個問題是輸出較大(來自子進程的「stdin:數據中意外的EOF,...」)。 – rockdaboot 2016-06-08 13:19:12

相關問題