2014-09-12 378 views
0

我正在研究一個小腳本。該腳本應該打開3個終端並獨立與終端交互。如何在Python中與終端進行交互

我很明白,子過程是最好的方式來做到這一點。我到目前爲止所做的:

# /usr/bin/env python 
import subprocess 

term1 = subprocess.Popen(["open", "-a", "Terminal"], stdin=subprocess.PIPE, stdout=subprocess.PIPE) 
term1.communicate(input="pwd") 

我的問題是我無法與新終端進行交互。這部分term1.communicate(input="pwd")不起作用。我無法將命令發送到新的終端。我也試過term1.communicate(input="pwd\n")但沒有任何反應

你有什麼想法我該怎麼做?

P.S.我正在使用Mac OS。

+1

你真的需要爲你打開所要完成什麼新的終端,或者你只需​​要運行'pwd'並捕獲輸出? – user2085282 2014-09-12 19:15:08

+1

此外,'溝通'等待進程完成,終端通常不會退出,直到關閉,所以它沒有任何意義。 – user2085282 2014-09-12 19:23:27

+0

@ user2085282在我的情況我必須運行2命令:「sudo tcprelay telnet」和「tcprelay --portoffset [arg1] [arg2]」,但問題是如果我運行其中一個命令而無需打開新的終端,我將不會能夠運行第二個,直到第一個完成/終止。這就是爲什麼我使用這個解決方案 – 2014-09-12 20:38:47

回答

2

您可以在不打開終端的情況下同時運行這兩個命令。

import subprocess 
process1 = subprocess.Popen(["ls", "-l"]) 
process2 = subprocess.Popen(["ls", "-l"]) 

如果您運行該代碼,您將看到該目錄列出了兩次,交錯在一起。您可以擴展此爲您的特定需求:

tcprelay1 = subprocess.Popen(["tcprelay", "telnet"]) 
tcprelay2 = subprocess.Popen(["tcprelay", "--portoffset [arg1] [arg2]") 
+0

問題是我必須在tcprealy1中使用「sudo」commannd並且必須與此通信。 – 2014-09-12 21:58:18

+0

然後,你將不得不用sudo來運行你的python腳本,並且要小心......你仍然可以和流程進行交流,我只是把這一部分留給了我。 – anderspitman 2014-09-12 22:51:51