Python 如何通过管道将子流程调用传递到文本文件?

Python 如何通过管道将子流程调用传递到文本文件?,python,linux,shell,unix,subprocess,Python,Linux,Shell,Unix,Subprocess,现在我有一个我运行的脚本。当我运行它,它点击这一行,它开始打印东西,因为run.sh中有打印 我如何将其也传输到文本文件?(如果可能的话,还可以打印)popen的选项可用于通话 subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"]) 所以 args, bufsize=0, executable=None, stdin=None, stdout=None, stderr=None, pree

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


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

popen的选项可用于
通话

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

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
(顺便说一句,它需要是一个文件)执行您想要的操作

此外,您还可以执行类似于这样的管道输出的操作

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

dmesg | grep hda

上有大量有趣、有用的信息。

如果要将输出写入文件,可以使用
子流程的-参数。call

它采用
None
子流程管道
、文件对象或文件描述符。第一个是默认值,stdout是从父级(脚本)继承的。第二种方法允许您通过管道从一个命令/进程传递到另一个命令/进程。第三个和第四个是您想要的,将输出写入文件

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

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
output = p2.communicate()[0]
我猜任何像对象这样的有效文件都可以工作,比如套接字(gasp:),但我从未尝试过


正如注释中提到的,您可能也希望重定向stderr,您可以使用
stderr=subprocess.stdout
将其重定向到与stdout相同的位置。上述任何一个值都可以工作,您可以重定向到不同的位置。

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

f = open("blah.txt", "w")
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=f)
这将覆盖该文件。您可以使用
>
附加到它


如果您想将错误也记录到文件中,请使用
&>
&>

为什么子进程调用([“echo”,“1”,“t.txt]”)有效?@Goldname您需要一个shell来进行重定向,因此:
子进程调用([“echo”,“1”,“>>,“t.txt]”,shell=True)
应该有效。@WesMason谢谢,但我认为subprocess.call的工作方式基本上类似于复制和粘贴到shell中?@Goldname-nah,subprocess中的所有内容都依赖于底层的Popen类,该类打开一个进程,shell=True将强制该进程在系统默认shell中执行(例如POSIX系统上的/bin/sh,通常是bash或dash),这样做更安全,因为您不需要接受shell提供的所有额外功能(一种完整的编程语言,如果传入用户提供的数据,它将自己利用这些功能)。如果您正在将任何可能的脏数据传递到子shell,请查看
shlex.quote
。完成后是否也要关闭该文件?这将在我们完成后关闭文件:
打开(“blah.txt”,“w”)作为f:subprocess.call([“/home/myuser/run.sh”,“/tmp/ad_xml”,“/tmp/video_xml”],stdout=f)
@Skurmedel
$ /path/to/the/script.py > output.txt