用Python包装Java程序的问题';s子流程模块

用Python包装Java程序的问题';s子流程模块,python,subprocess,Python,Subprocess,我有一个小型java程序,可以使用以下语法从命令行运行: java-jarexev.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 p

我有一个小型java程序,可以使用以下语法从命令行运行:

java-jarexev.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也不会抛出任何错误。有人能帮我解决这个问题吗?

您需要使用
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')
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:

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')
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')

其中,第一个更好:当Python已经提供了这些功能时,没有理由使用shell的重定向。