在我的Python脚本中,我试图运行一个Windows程序打印输出。 但是我想将输出redirect到一个文本文件。 我试过了
command = 'program' + arg1 + ' > temp.txt' subprocess.call(command)
程序是我的程序名称,arg1是参数。 但它不会将输出redirect到文本文件它只是将其打印在屏幕上。
任何人都可以帮助我如何做到这一点? 谢谢!
将文件对象传递给subprocess.call()
的stdout
参数:
with open('myoutfilename', 'w') as myoutfile: subprocess.call(cmd, stdout=myoutfile)
你可以在subprocess.call
使用shell=True
但是,更好的方法是:
command = ['program',arg1] with open('temp.txt','w') as fout: subprocess.call(command,stdout=fout)
这从整个东西中删除了shell,使得它更独立于系统,而且它也使得你的程序免于“shell注入”攻击(考虑arg1='argument; rm -rf ~'
或者任何类似的窗口)。
上下文管理器( with
语句)是一个好主意,因为它可以保证当你离开“上下文”时你的文件对象被正确地刷新和关闭。
请注意,如果您对subprocess.Popen
(或类似的)类不使用shell=True
,则应该将参数作为列表传递,而不是字符串。 你的代码将会更加健壮。 如果你想使用一个字符串,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)