关于python:如何将子进程调用传递给文本文件?

How do I pipe a subprocess call to a text file?

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

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

如何将其传输到文本文件? (还可以打印,如果可能的话)


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

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

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

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

我猜测任何有效的文件类对象都可以工作,就像socket(gasp :)),但我从来没有尝试过。

正如marcog在评论中提到的那样,您可能也希望重定向stderr,您可以使用stderr=subprocess.STDOUT将其重定向到与stdout相同的位置。任何上述值都可以使用,您可以重定向到不同的位置。


popen的选项可以在call中使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

所以...

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

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

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

1
dmesg | grep hda

将会:

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

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