2012-03-20 25 views
3

我有,我可以在命令行使用此語法運行一個小型的Java程序:問題與Python的子模塊包裝Java程序

java -jar EXEV.jar -s:myfile

這個Java程序的打印一些數據在屏幕上和我想將stdout重定向到一個名爲output.txt的文件中。

from subprocess import Popen, PIPE 

def wrapper(*args): 
    process = Popen(list(args), stdout=PIPE) 
    process.communicate()[0] 
    return process 

x = wrapper('java', '-jar', 'EXEV.jar', '-s:myfile', '>', 'output.txt') 

當我運行上面,output.txt不會被寫入和Python不會引發任何錯誤。任何人都可以幫我弄清楚這個問題嗎?

回答

3

您必須要麼使用stdout=output其中output是一個開放的文件寫入到「output.txt的」,並在命令刪除輸出重定向,或離開輸出重定向的命令,並使用shell=True沒有stdout說法:

選項1:

from subprocess import Popen 

def wrapper(*args): 
    output = open('output.txt', w) 
    process = Popen(list(args), stdout=output) 
    process.communicate() 
    output.close() 
    return process 

x = wrapper('java', '-jar', 'EXEV.jar', '-s:myfile') 

選項2:

from subprocess import Popen 

def wrapper(*args): 
    process = Popen(' '.join(args), shell=True) 
    process.communicate() 
    return process 

x = wrapper('java', '-jar', 'EXEV.jar', '-s:myfile', '>', 'output.txt') 
+2

其中,第一個更好:當Python提供設備時,沒有理由使用shell的重定向。 – katrielalex 2012-03-20 22:09:05