2010-09-27 73 views
1

我想創建一個GUI python腳本來啓動多個進程。所有這些進程最初都是通過使用perl腳本(start_workspace.perl)設置shell來調用的,然後在shell下鍵入可執行文件名。 裏面,start_workspace.perl,它首先設置一些ENV變量,然後調用啓動shell的exec(/ bin/bash),這樣你可以在提示符下鍵入「execfile」來啓動。我的問題,從我的python腳本,我仍然想要使用此shell(通過subprocess.popen(「perl start_workspace.perl」)),但我不想被停止手動輸入「execfile」。我希望能夠在調用「start_workspace.perl」的步驟中指定「execfile」,並且該過程可以在沒有任何干預的情況下完成。如何將命令作爲python子進程中啓動的shell的輸入

像命令重定向。但我不知道這是否可能。

subprocess.popen(( 「perl的start_workspace.perl」)< 「的execfile」)

回答

1

使用subprocess模塊,可以通過這種方式實現。一旦設置了實際環境,您就可以使用標準輸入流編寫要執行的命令。

start_workspace.perl

print "Perl: Setting some env variables\n"; 
$ENV{"SOME_VAR"} = "some value"; 
print "Perl: Starting bash\n"; 
exec('bash'); 

在蟒蛇:

import subprocess 
p = subprocess.Popen("perl start_workspace.perl", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) 
p.stdin.write('echo "Python: $SOME_VAR"\n') 
p.stdin.write("make\n") 
(stdoutdata, stderrdata) = p.communicate() 
print stdoutdata 
print stderrdata 

輸出是

Perl: Setting some env variables 
Perl: Starting bash 
Python: some value 

make: *** No targets specified and no makefile found. Stop. 
+0

我修復了你缺少的引用,但我認爲這個問題涉及到不給execfile的名稱給標準輸入,但內容。 – mkb 2010-09-27 20:12:07

+0

嗨,羅德,非常感謝你的回答。所以你的意思是,一旦shell啓動,p.write(「./execfile」)可以作爲輸入。我會盡力回來。再次感謝! – pepero 2010-09-27 20:18:01

+0

嗨,我試過了。不幸的是,這一個不起作用。我使用的execfile是「make」。 make不叫。 – pepero 2010-10-22 10:36:35

2

你非常接近。在subprocess documentation,請參見:

標準輸入標準輸出stderr的指定執行的程序標準輸入,標準輸出和標準錯誤的文件句柄,分別。有效值是PIPE,現有文件描述符(正整數),現有文件對象和None。 PIPE表示應該創建一個新的管道給孩子。無,不會發生重定向;孩子的文件句柄將從父類繼承。另外,stderr可以是STDOUT,它表示應用程序的stderr數據應該被捕獲到與stdout相同的文件句柄中。

stdin,stderr和stdout被命名爲popen方法的參數。您可以打開輸入文件並將其文件描述符作爲標準輸入傳遞到新進程。

+0

喜,馬特,非常感謝你的回答。你的意思是我可以使用以下內容:file = os.fdopen('./ execfile'),然後subprocess.popen(「perl start_workspace.perl」,stdin = file)? – pepero 2010-09-27 19:56:06

+0

我不是一個真正的Python傢伙,但這似乎是合理的。 – mkb 2010-09-27 20:12:38

相關問題