将stdout从subprocess.Popen一行一行地保存到文件中

Chr*_*ris 8 python subprocess

我的python脚本使用子进程来调用另一个脚本,这会产生非常慢的输出(逐行).我希望在整个过程结束时将输出逐行写入文件并将整个输出写为字符串.以下代码在"脚本"结束时将输出写入"文件".

args = ("script")
file = open('output.txt', 'w')
subprocess.Popen(args,stdout=file)
Run Code Online (Sandbox Code Playgroud)

它甚至可能吗?谢克斯,克里斯

Mic*_*lon 1

对的,这是可能的。这是我为测试工具编写的一个函数,用于对 Python shell 脚本进行单元测试。

def testrun(cmdline):
   try:
      cmdout, cmderr = "",""
      cmdp = Popen(cmdline, shell=True,stdout=PIPE, stderr=PIPE)
      cmdout,cmderr =  cmdp.communicate()
      retcode = cmdp.wait()
      if retcode < 0:
         print >>sys.stderr, "Child was terminated by signal", -retcode
      else:
         return (retcode,cmdout,cmderr)
   except OSError, e:
      return (e,cmdout,cmderr)
Run Code Online (Sandbox Code Playgroud)

该函数返回一个元组,其中包含 shell 返回代码 issues by sys.exit()、标准输出文本和标准错误输出文本。它们都是文本字符串,因此您需要splitlines在处理之前将它们分成几行。

如果您确实需要逐行与输出交互,那么使用pexpect而不是subprocess模块可能更好。