标题说明了一切,真的。目前正在使用subprocess32
运行Python 2.7.8。最小复制片段,直接从REPL复制:
Python 2.7.8 (default, Aug 14 2014, 13:26:38)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import tempfile
>>> import subprocess32 as subp
>>> tfil = tempfile.TemporaryFile()
>>> tfil
<open file '<fdopen>', mode 'w+b' at 0x7f79dcf158a0>
>>> proc = subp.Popen(['ls', '-al'], stdout=tfil, stderr=subp.STDOUT)
>>> proc
<subprocess32.Popen object at 0x7f79dcf04a50>
>>> proc.wait()
0
>>> tfil.read()
''
>>>
对结果没有任何影响的代码的更改,无论如何:
subprocess
代替subprocess32
NamedTemporaryFile
代替TemporaryFile
bufsize=0
和tfil
proc
subp.Popen(['ls', '-al'], stdout=sys.stdout, stderr=subp.STDOUT)
,输出会很好地重定向到终端 - 但我需要将其捕获到其他地方,我不能将它与实际的终端输出混合在一起。将sys.stdout
重定向到临时文件,然后在完成该过程后将其重新设置,也不起作用。我需要这样做,因为我想在实际的非最小化示例程序(qacct -j
)中使用的命令的输出对于subprocess.PIPE
来说太大了, MemoryError
(没有进一步的细节)。
我发现的最相关的现有问题是this,但实际上并没有帮助。
答案 0 :(得分:4)
文件已正确写入,但您的tfil.read()
命令将在最后一次写入时开始读取,因此它不会返回任何内容。您需要先致电tfil.seek(0)
。