Python 如何使用自定义的类文件对象作为子进程stdout/stderr?
考虑这段代码,其中产生了一个Python 如何使用自定义的类文件对象作为子进程stdout/stderr?,python,subprocess,Python,Subprocess,考虑这段代码,其中产生了一个子流程.Popen。我希望写入子进程“stdout和stderr以转到我的自定义文件对象的.write()方法,但情况并非如此 导入子流程 类打印机: 定义初始化(自): 通过 def写入(自身、区块): 打印('写入:',块) def文件号(自身): 返回0 def关闭(自我): 返回 proc=subprocess.Popen(['bash','-c','echo Testing'], stdout=打印机(), stderr=subprocess.STDOUT)
子流程.Popen
。我希望写入子进程“stdout
和stderr
以转到我的自定义文件对象的.write()
方法,但情况并非如此
导入子流程
类打印机:
定义初始化(自):
通过
def写入(自身、区块):
打印('写入:',块)
def文件号(自身):
返回0
def关闭(自我):
返回
proc=subprocess.Popen(['bash','-c','echo Testing'],
stdout=打印机(),
stderr=subprocess.STDOUT)
进程等待()
为什么不使用.write()
方法,在这种情况下指定stdout=
参数有什么用?根据:
stdin、stdout和stderr分别指定执行程序的标准输入、标准输出和标准错误文件句柄。有效值包括管道、DEVNULL、现有文件描述符(正整数)、现有文件对象和None
使用:
不直接。也许Python的某些未来版本将支持将类似文件的对象转换为某种自动填充管道,但关键是子流程需要访问一个文件句柄,它可以在不调用Python代码的情况下读取该句柄。这意味着它需要在操作系统级别工作,这意味着它仅限于几种可能性:
- 从父进程继承stdin(当
时发生)stdin=None
- 从文件获取输入(当
是文件或整数文件句柄时发生)stdin
- 从管道获取输入(当
时发生)stdin=subprocess.pipe
proc = subprocess.Popen(['sha256sum', '-'], stdin=subprocess.PIPE)
while True:
chunk = filelike.read(BLOCK_SIZE)
proc.stdin.write(chunk)
if len(chunk) < BLOCK_SIZE:
break
proc.wait()
proc=subprocess.Popen(['sha256sum','-',stdin=subprocess.PIPE)
尽管如此:
chunk=filelike.read(块大小)
进程标准写入(块)
如果len(块)<块大小:
打破
进程等待()
这是可行的,但是我需要将stdout
和stderr
分开(应该是有问题的),并且是实时的。还有,为什么我的示例不起作用,它不是一个类似文件的对象吗?@minerz029,正如我引用的文档所述,subprocess.Popen不接受类似文件的对象,而只接受PIPE
,DEVNULL
,一个文件描述符,一个文件对象,None
@minerz029,用于proc.stdout:print('Writing',line.decode())中的行
@minerz029,如果要写入标准输出,则文件号的返回值应为1
。即使更改为1
,也不会调用write
方法。它只是写入当前进程的stdout。感谢该链接,它看起来非常有用。下面是一个示例,其中一个自定义的类似文件的对象用作子进程stdout/stderr:
proc = subprocess.Popen(['sha256sum', '-'], stdin=subprocess.PIPE)
while True:
chunk = filelike.read(BLOCK_SIZE)
proc.stdin.write(chunk)
if len(chunk) < BLOCK_SIZE:
break
proc.wait()