如何将子进程调用传递给文本文件?

TIM*_*MEX 80 python unix linux shell subprocess

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"])
Run Code Online (Sandbox Code Playgroud)

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

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

Sku*_*del 140

如果要将输出写入文件,可以使用stdout -argument 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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Goldname你需要一个shell来做重定向,所以:`subprocess.call(["echo","1",">>","t.txt"],shell = True)`应该工作. (7认同)
  • 为什么不subprocess.call(["echo","1",">>","t.txt"])工作? (4认同)
  • @Goldname 不,子进程中的一切都依赖于底层的 Popen 类,它打开一个进程,shell=True 将强制该进程在系统默认 shell 中执行(例如 POSIX 系统上的 /bin/sh,通常是 bash 或 dash ),这样更安全,因为您不接受 shell 提供的所有额外功能(一种完整的编程语言本身,如果传递用户提供的数据,它就有自己的漏洞)。如果您将任何可能的脏数据传递给子 shell,还可以查看 `shlex.quote`。 (3认同)
  • 完成后是否还应该关闭文件?这将在完成后关闭文件:以open(“ blah.txt”,“ w”)作为f:subprocess.call([“ / home / myuser / run.sh”,“ / tmp / ad_xml”, “ / tmp / video_xml”],stdout = f)`@Skurmedel (2认同)

oco*_*odo 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
Run Code Online (Sandbox Code Playgroud)

所以...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml",  "/tmp/video_xml"], stdout=myoutput)
Run Code Online (Sandbox Code Playgroud)

然后你可以做你想要的myoutput(这需要是一个文件btw).

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

dmesg | grep hda
Run Code Online (Sandbox Code Playgroud)

将会:

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

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