无法在子进程中获取二进制stdin/stdout

2024-03-29 08:40:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试使用并行Python(pp)模块实现一个子流程应用程序,该模块使用subprocesssubprocess.PIPE在主进程和工作进程之间传递序列化的指令和响应。我在worker的stdin.read()命令返回空字符串时遇到了断断续续的问题,而不是在收到命令之前阻塞的正常行为。你知道吗

经过一点研究,我认为原因是工作进程的io流处于文本模式,并试图传递pickle对象。他们最终得到的东西看起来像一个EOF,然后自动返回空的。在pp源代码中,它甚至在其调用序列中指定了-u标志,但是生成的worker流似乎不是二进制模式,即使调用Python解释器是二进制模式。这里和其他地方建议的修复方法是使用msvcrt模块将io格式更改为二进制,但由于某些原因,它似乎没有任何效果。你知道吗

我做了下面的演示脚本。这是Python 2.7.12,32位,在Windows 10中:

#master.py
import subprocess

if __name__ == '__main__':

    foo = subprocess.Popen(
            args = ['pythonw.exe','-u','-m','worker'],
            stdin = subprocess.PIPE,
            stdout = subprocess.PIPE,
            stderr = subprocess.PIPE,
        )

    open('master_log.txt','a').write(str(foo.stdin) + '\n')
    open('master_log.txt','a').write(str(foo.stdout) + '\n')

…在同一个文件夹中。。。你知道吗

#worker.py
import sys, os, msvcrt

if __name__ == '__main__':
    open('worker_log.txt','a').write('Initial Properties\n')
    open('worker_log.txt','a').write(str(sys.argv[0]) + '\n')
    open('worker_log.txt','a').write(str(sys.stdin) + '\n')
    open('worker_log.txt','a').write(str(sys.stdout) + '\n')
    open('worker_log.txt','a').write('Applying msvcrt.setmode()\n')
    msvcrt.setmode(sys.stdin.fileno(),os.O_BINARY)
    msvcrt.setmode(sys.stdout.fileno(),os.O_BINARY)
    open('worker_log.txt','a').write(str(sys.stdin) + '\n')
    open('worker_log.txt','a').write(str(sys.stdout) + '\n')

从windows命令提示符:

python -u -m master.py

收益率:

#master_log.txt
<open file '<fdopen>', mode 'wb' at 0x02FA06A8>
<open file '<fdopen>', mode 'rb' at 0x02FA0D30>

#worker_log.txt
Initial Properties
C:\Users\204040537\Documents\Python\pygtp_addin\worker.py
<open file '<stdin>', mode 'r' at 0x031BD020>
<open file '<stdout>', mode 'w' at 0x031BD078>
Applying msvcrt.setmode()
<open file '<stdin>', mode 'r' at 0x031BD020>
<open file '<stdout>', mode 'w' at 0x031BD078>

建议?我不知道如何强制子进程IO流读取二进制。你知道吗


Tags: mastertxtlogmodestdinstdoutsysopen
1条回答
网友
1楼 · 发布于 2024-03-29 08:40:27

小时候,这个问题的解决方案(似乎)是,与我的工作人员正在使用的内部DLL相关的某个东西导致我的python解释器行为不稳定。 交互式Python会话在包含违规命令的行完成后退出,即使该行上有多个语句,例如

result = offending_command(some_data); print result

将运行,并打印正确的结果,但解释器将立即退出。在python脚本中使用有问题的命令并通过execfile()调用将正常运行,但python解释器在完成后立即退出。some_data上的变化可以重复地导致或阻止这种行为。你知道吗

我的工作人员继续运行,持续的错误日志条目证明了这一点,但是他们的stdin管道似乎坏了?日志消息表明stdin管道仍处于打开状态。在任何情况下,这似乎都不是子流程的问题。你知道吗

相关问题 更多 >