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()