【发布时间】:2011-06-18 21:36:21
【问题描述】:
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"])
现在我有一个可以运行的脚本。当我运行它并到达这一行时,它会开始打印内容,因为 run.sh 中有打印内容。
我如何也将其通过管道传输到文本文件? (如果可能,还可以打印)
【问题讨论】:
标签: python shell subprocess
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"])
现在我有一个可以运行的脚本。当我运行它并到达这一行时,它会开始打印内容,因为 run.sh 中有打印内容。
我如何也将其通过管道传输到文本文件? (如果可能,还可以打印)
【问题讨论】:
标签: python shell subprocess
popen 的选项可以在call 中使用
args,
bufsize=0,
executable=None,
stdin=None,
stdout=None,
stderr=None,
preexec_fn=None,
close_fds=False,
shell=False,
cwd=None,
env=None,
universal_newlines=False,
startupinfo=None,
creationflags=0
所以...
myoutput = open('somefile.txt', 'w')
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=myoutput)
然后你可以用myoutput做你想做的事
此外,您可以像这样更接近管道输出。
dmesg | grep hda
应该是:
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
python manual page 上有很多可爱、有用的信息。
【讨论】:
如果要将输出写入文件,可以使用stdout-参数subprocess.call。
两者都需要
None(默认情况下,stdout 继承自父级(您的脚本))subprocess.PIPE(允许您从一个命令/进程通过管道传输到另一个)你需要用open之类的东西打开一个文件,并将对象或文件描述符整数传递给call:
f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f)
我猜任何有效的类似文件的对象都可以工作,比如套接字(喘气:)),但我从未尝试过。
正如 marcog 在 cmets 中提到的,您可能还希望重定向 stderr,您可以使用 stderr=subprocess.STDOUT 将其重定向到与 stdout 相同的位置。上面提到的任何值都可以,你可以重定向到不同的地方。
【讨论】:
subprocess.call(["echo", "1", ">>", "t.txt"], shell=True) 应该可以工作。
shlex.quote。
with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @Skurmedel