[英]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.