2

在我的 python 脚本中,我试图运行一个打印输出的 Windows 程序。但我想将该输出重定向到文本文件。我试过

     command = 'program' + arg1 + ' > temp.txt'
     subprocess.call(command)

其中 program 是我的程序名称,而 arg1 是它需要的参数。但它不会将输出重定向到文本文件它只是将其打印在屏幕上。

谁能帮助我如何做到这一点?谢谢!

4

2 回答 2

9

将文件对象传递给 的stdout参数subprocess.call()

with open('myoutfilename', 'w') as myoutfile:
    subprocess.call(cmd, stdout=myoutfile)
于 2013-01-02T21:18:04.147 回答
5

你可以shell=Truesubprocess.call

但是,一个(很多)更好的方法是:

command = ['program',arg1]
with open('temp.txt','w') as fout:
    subprocess.call(command,stdout=fout)

这从整个事物中删除了外壳,使其更加独立于系统,并且还使您的程序免受“外壳注入”攻击(考虑arg1='argument; rm -rf ~'或任何 Windows 等效项)。

上下文管理器(with语句)是一个好主意,因为它保证您的文件对象在您离开“上下文”时被正确刷新和关闭。

请注意,如果您不使用shell=Truesubprocess.Popen或类似)类,则应将参数作为列表而不是字符串传递,这一点很重要。这样,您的代码将更加健壮。如果你想使用字符串,python 提供了一个方便的函数shlex.split来将字符串拆分为参数,就像你的 shell 一样。例如:

 import subprocess
 import shlex
 with open('temp.txt','w') as fout:
     cmd = shlex.split('command argument1 argument2 "quoted argument3"'
     #cmd = ['command', 'argument1', 'argument2', 'quoted argument3']
     subprocess.call(cmd,stdout=fout)
于 2013-01-02T21:16:42.707 回答