subprocess.Popen() IO重定向
我想把一个子程序的输出内容保存到一个文件里。
这是我的代码文件: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。