在我的 python 脚本中,我试图运行一个打印输出的 Windows 程序。但我想将该输出重定向到文本文件。我试过
command = 'program' + arg1 + ' > temp.txt'
subprocess.call(command)
其中 program 是我的程序名称,而 arg1 是它需要的参数。但它不会将输出重定向到文本文件它只是将其打印在屏幕上。
谁能帮助我如何做到这一点?谢谢!
将文件对象传递给 的stdout
参数subprocess.call()
:
with open('myoutfilename', 'w') as myoutfile:
subprocess.call(cmd, stdout=myoutfile)
你可以shell=True
在subprocess.call
但是,一个(很多)更好的方法是:
command = ['program',arg1]
with open('temp.txt','w') as fout:
subprocess.call(command,stdout=fout)
这从整个事物中删除了外壳,使其更加独立于系统,并且还使您的程序免受“外壳注入”攻击(考虑arg1='argument; rm -rf ~'
或任何 Windows 等效项)。
上下文管理器(with
语句)是一个好主意,因为它保证您的文件对象在您离开“上下文”时被正确刷新和关闭。
请注意,如果您不使用shell=True
(subprocess.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)