【发布时间】:2014-07-10 15:35:45
【问题描述】:
我目前正在尝试将 subprocess.Popen 对象的标准输出重定向到打开的文件,因此我遵循了许多网站上的说明,例如 this。
但是,由于某种原因,Popen.stdout 没有正确分配
我的代码如下:
def foo(file):
print(file) # printA
proc = subprocess.Popen('command, stdout=file) # i've tried with both shell=True/False
print(proc) # printB
print(proc.stdout) # printC
return proc
def main():
file = open('path', 'w')
p = foo(file)
print(p.stdout) # printD
结果如下
printA: <_io.TextIOWrapper name='path' mode='w' encoding='UTF-8'>
printB: <subprocess.Popen object at 0x161966d0>
printC: None
printD: None
根据我在 python 文档 here 中读到的内容,如果没有分配 PIPE,则 stdout 的默认值为 None。但是由于this 这里表明显然我们可以将打开的文件作为参数传递给标准输出,所以我不明白为什么我的代码不起作用。
请帮忙。
【问题讨论】:
-
printA 清楚地表明 open 返回的是 NOT 标准文件(带有 OS 文件描述符,这是子进程真正需要的)。为此,您必须传递一个真实文件。
-
@deets 你的意思是像 .log 或 .txt 文件?
-
W: 1,8:foo: 重新定义内置 'file' W: 10,4:main: 未使用的变量 'f'
-
忘记我的答案 - 我不知道 io-modul 在这里的含义,它看起来像 StringIO 这样的内存包装器,它不起作用。可能@zmo 的回答不错。
-
在 python 3 中,文件的类型为
io.textiowrapper
标签: python python-3.x subprocess stdout popen