subprocess.Popen() IO重定向

14 投票
2 回答
21039 浏览
提问于 2025-04-17 10:28

我想把一个子程序的输出内容保存到一个文件里。

这是我的代码文件: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确实是正确启动的。

2 个回答

9

用“>”进行输出重定向是命令行的一项功能——默认情况下,subprocess.Popen 并不会创建一个命令行环境。这样写应该可以正常工作:

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

另外,你可以使用 stdout 参数来配合一个文件对象:

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

文档中有解释:

stdin、stdout 和 stderr 分别表示被执行程序的标准输入、标准输出和标准错误的文件句柄。有效的值包括 PIPE、一个已经存在的文件描述符(一个正整数)、一个已经存在的文件对象,以及 None。

撰写回答