如何将subprocess调用传递给文本文件?

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"]) 

现在我有一个脚本,我跑。 当我运行它,它击中这条线,它开始打印的东西,因为run.sh打印在它。

我如何将这个pipe道文本文件? (如果可能,也打印)

如果你想把输出写到一个文件中,你可以使用subprocess.call的stdout -argument。

它采用Nonesubprocess.PIPE ,一个文件对象或一个文件描述符。 第一个是默认的,stdout是从父(你的脚本)inheritance的。 第二个允许你从一个命令/进程pipe道到另一个。 第三和第四是你想要的,有输出写入文件。

你需要打开一个类似打开的文件,并传递对象或文件描述符整数来call

 f = open("blah.txt", "w") subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) 

我猜测任何有效的文件类对象将工作,像一个套接字(喘气:)),但我从来没有尝试过。

正如marcog在注释中提到的,你也可能想redirectstderr,你可以用stderr=subprocess.STDOUT subprocess.STDOUT将它redirect到stdout所在的位置。 以上提到的任何值都适用,您可以redirect到不同的地方。

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 

所以…

 subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=myoutput) 

然后,你可以用我的输出做什么(这将需要一个文件btw)。

此外,你可以做一些更接近像这样的pipe道输出。

 dmesg | grep hda 

将会:

 p1 = Popen(["dmesg"], stdout=PIPE) p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) output = p2.communicate()[0] 

在Python手册页上有很多可爱的,有用的信息。