subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"])
现在,我有了运行的脚本。当我运行它并到达此行时,它开始打印内容,因为run.sh中有打印内容。
我如何也将其通过管道传输到文本文件?(如果可能,还可以打印)
Answers:
如果要将输出写入文件,可以使用stdout -argument of subprocess.call
。
它需要None
,subprocess.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
。上述任何一个值也可以使用,您可以重定向到其他位置。
subprocess.call(["echo", "1", ">>", "t.txt"], shell=True)
应该可以工作。
shlex.quote
是否将任何可能脏的数据传递给子shell。
with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f)
@Skurmedel
的选项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手册页上有很多可爱而有用的信息。