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

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

RIght now I have a script that I run. When I run it and it hits this line, it starts printing stuff because run.sh has prints in it.

How do I pipe this to a text file also? (And also print, if possible)

170617 次浏览

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 手册页有很多可爱有用的信息。

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

两者皆有可能

  • 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在评论中提到的,您可能也想重定向 stderr,您可以使用 stderr=subprocess.STDOUT将其重定向到与 stdout 相同的位置。上面提到的任何值都可以工作,您可以重定向到不同的位置。