我在 QNX 系統上運行 Python 2.7,但遇到了 pexpect 引發以下錯誤的問題:
ExceptionPexpect: isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?
這個錯誤的情況如下:我有兩個檔案, pexpectTest.py和testPexpectError.py.
pexpectTest.py
匯入多處理
進口預期
匯入系統
pexp = pexpect.spawn('python testPexpectError.py')
pexp.delaybeforesend = False
pexp.logfile = sys.stdout
定義測驗():
pexp.sendline('line')
pexp.expect('>', timeout=None)
pexp.close()
mp = multiprocessing.Process(目標=測驗)
mp.start()
mp.join()
測驗預期錯誤.py
匯入時間
而 1:
input = raw_input(">")
列印輸入
如果輸入=='退出':
休息
時間.睡眠(1)
當從 multiprocessing.Process 呼叫時,會拋出本文頂部的例外。從主執行緒呼叫時,不會拋出例外。
我的主要問題是:
當從 multiprocessing.Process 呼叫 expect 與在主執行緒中呼叫 expect 時(如果這甚至是問題),是什么導致 pexpect 對 testPexpectError.py 中的等待呼叫做出反應?
有沒有辦法解決?
uj5u.com熱心網友回復:
請記住, 的關鍵區別特征multiprocessing是它在單獨的 process 中生成一個函式。
檔案描述符不會跨行程邊界共享(子行程可能會獲得父行程FD的副本,但這是一個可選的每個 FD 標志——請參閱https://docs.python.org/3/library/os.html# fd-inheritance描述 Python 置于該層之上的介面)。
同樣,父/子關系僅適用于原始父waitpid()行程:您可以用來獲取子行程,而不是兄弟行程(同一個父行程的同級子行程,這是您的副本python testPexpectError.py和multiprocessing-spawned 子行程在此處的關系) .
如果你真的需要在multiprocessing這里使用,把它spawn()移到你的test()函式中,這樣子行程的輸出和退出狀態就會被它的父行程(而不是兄弟行程)讀取,一切都會正常作業。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/328731.html
標籤:Python python-2.7 多处理 期待 qnx
