【问题标题】:subprocess.Popen() IO redirectsubprocess.Popen() IO 重定向
【发布时间】:2012-01-17 21:49:44
【问题描述】:

尝试将子进程的输出重定向到文件。

server.py:

while 1:
    print "Count " + str(count)
    sys.stdout.flush()
    count = count + 1
    time.sleep(1)

劳谢:

cmd = './server.py >temp.txt'
args = shlex.split(cmd)
server = subprocess.Popen( args )

输出出现在屏幕上,temp.txt 保持为空。 我做错了什么?

作为背景,我正在尝试捕获已经编写好的程序的输出。

我不能使用:

server = subprocess.Popen(
                [exe_name],
                stdin=subprocess.PIPE, stdout=subprocess.PIPE)

因为程序可能不会刷新。 相反,我打算通过 fifo 重定向输出。如果我手动启动 server.py 这工作正常,但如果我 Popen() 导致重定向不起作用显然不会。 ps -aux 表示server.py 已正确启动。

【问题讨论】:

标签: python popen


【解决方案1】:

或者,您可以将stdout 参数与文件对象一起使用:

with open('temp.txt', 'w') as output:
    server = subprocess.Popen('./server.py', stdout=output)
    server.communicate()

documentation中所述:

stdin、stdout 和 stderr 分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值为 PIPE、现有文件描述符(正整数)、现有文件对象和 None。

【讨论】:

  • 这行得通。通信会阻止阅读器,直到服务器终止,但现在我可以重定向,我可以将服务器输出发送到 fifo。
  • 这里无需致电.communicate()subprocess.check_call('command', stdout=file) 工作。
【解决方案2】:

使用 ">" 进行输出重定向是 shell 的一项功能 - 默认情况下,subprocess.Popen 不会实例化一个。这应该有效:

server = subprocess.Popen(args, shell=True)

【讨论】:

  • 使用shell=True 不是首选方式,除非有必要(这里不是)
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多