如何将子进程调用传递给文本文件?

时间:2011-01-31 21:54:25

标签: python linux shell unix subprocess

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

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

如何将其传输到文本文件? (并且如果可能的话也打印)

3 个答案:

答案 0 :(得分:124)

如果要将输出写入文件,可以使用subprocess.call - None的参数。

它需要subprocess.PIPEopen,文件对象或文件描述符。第一个是默认值,stdout是从父(您的脚本)继承的。第二个允许您从一个命令/进程管道到另一个命令/进程。第三个和第四个是您想要的,将输出写入文件。

您需要打开一个类似call的文件,并将对象或文件描述符整数传递给f = open("blah.txt", "w") subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f)

stderr=subprocess.STDOUT

我猜测任何有效的类似文件的对象都会起作用,比如socket(gasp :)),但我从未尝试过。

在评论中提及stdout您可能还想重定向stderr,您可以使用{{1}}将其重定向到与stdout相同的位置。任何上述值都可以使用,您可以重定向到不同的位置。

答案 1 :(得分:16)

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)

然后你可以使用myoutput(它需要是一个文件btw)来做你想要的。

此外,您可以更接近像这样的管道输出。

dmesg | grep hda

将是:

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

python manual page上有很多可爱有用的信息。

答案 2 :(得分:-2)

如果有帮助,您也可以从终端调用脚本,将所有内容输出到文件中。 这样:

$ /path/to/the/script.py > output.txt

这将覆盖文件。您可以使用>>附加到它。

如果您还希望将错误记录到文件中,请使用&>>&>