如何将子流程调用传递到文本文件?


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

现在,我有了运行的脚本。当我运行它并到达此行时,它开始打印内容,因为run.sh中有打印内容。

我如何也将其通过管道传输到文本文件?(如果可能,还可以打印)

Answers:


171

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

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

您需要使用类似的文件打开文件,open然后将对象或文件描述符整数传递给call

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

我猜测任何有效的类似文件的对象都可以工作,例如套接字(gasp :)),但是我从未尝试过。

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


5
subprocess.call([[“ echo”,“ 1”,“ >>”,“ t.txt”])为什么不起作用?
StackOverflowOfficial

7
@Goldname您需要一个Shell来进行重定向,因此:subprocess.call(["echo", "1", ">>", "t.txt"], shell=True)应该可以工作。
Wes Mason

@WesMason谢谢,但是我认为subprocess.call的工作方式基本上类似于复制并粘贴到shell中?
StackOverflowOfficial

2
@Goldname不,子进程中的所有内容都依赖于基础Popen类,这将打开一个进程,shell = True将强制该进程在系统默认Shell中执行(例如POSIX系统上的/ bin / sh,通常为bash或dash) ),这样就更安全了,因为您无需使用shell提供的所有其他功能(一种完整的编程语言本身,如果传递用户提供的数据则具有自己的漏洞)。还要看看shlex.quote是否将任何可能脏的数据传递给子shell。
Wes Mason

4
完成后是否还应该关闭文件?完成后,这将关闭文件:with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @Skurmedel
alper

18

的选项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(需要将其作为文件)。

同样,您可以像这样通过管道输出进行更接近的操作。

dmesg | grep hda

将是:

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.