簡體   English   中英

無法在子進程中獲取二進制stdin / stdout

[英]Unable to get binary stdin/stdout in Subprocesses

我一直在嘗試使用Parallel Python( pp )模塊實現子處理應用程序,該模塊將subprocess進程與subprocess.PIPE一起使用,以在主進程和工作進程之間傳遞序列化的指令和響應。 工作人員的stdin.read()命令返回空字符串時遇到間歇性問題,而不是正常的阻塞行為,直到收到命令為止。

經過一些研究,我相信原因是工作進程的io流處於文本模式,並試圖傳遞腌制的對象。 他們最終得到的東西看起來像EOF,然后自動返回空。 pp源代碼中查看時,它甚至在其調用序列中指定-u標志,但即使調用的Python解釋器在其中,生成的工作程序流也似乎不在二進制模式下。 此處和其他地方建議的修復方法是使用msvcrt模塊將io格式更改為二進制,但是由於某種原因,它似乎沒有任何作用。

我制作了以下演示腳本。 這是Windows 10中的Python 2.7.12(32位):

#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流讀取二進制文件。

Whelp,此問題的解決方案(似乎)是與工作人員正在使用的內部DLL相關的某件事導致我的python解釋器行為異常。 交互式Python會話在包含有問題的命令的行完成后退出,即使該行上有多個語句,例如

result = offending_command(some_data); print result

將運行,並輸出正確的結果,但是解釋器將立即退出。 在python腳本中使用有問題的命令並通過execfile()調用將正常運行,但是python解釋器在完成后立即退出。 some_data上的some_data可重復導致或阻止此行為。

我的工人繼續運行,這由不斷出現的錯誤日志條目證明,但是他們的stdin管道似乎壞了? 日志消息指示stdin管道仍處於打開狀態。 無論如何,這似乎不是子流程的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM