如何在Python中的子進程獲取鍵盤輸入
場景:在Python中使用multiprocessing模塊的Process創建子進程,試圖在子進程中獲取鍵盤輸入。
使用input()
在子進程中使用input()會彈出報錯信息:EOFError: EOF when reading a line。
代碼示例
from multiprocessing import Process
import sys
def test_input():
info = input()
print("start print info!")
print(info)
if __name__ == "__main__":
print("start progress!")
Process(target=test_input).start()
結果輸出
start progress!
Process Process-1:
Traceback (most recent call last):
File "D:\software\Python\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "D:\software\Python\lib\multiprocessing\process.py", line 93, in run
self._target(*self._args, **self._kwargs)
File "D:\text_project\python\驗收2\test.py", line 5, in test_input
info = input()
EOFError: EOF when reading a line
Process finished with exit code 0
使用sys.stdin.readline()
在子進程中使用sys.stdin.readline(),發現并不會等待鍵盤輸入。
代碼示例
import sys
from multiprocessing import Process
def test_input():
info = sys.stdin.readline()
print("start print info!")
print(info)
if __name__ == "__main__":
print("start progress!")
Process(target=test_input).start()
結果輸出
start progress!
start print info!
Process finished with exit code 0
使用fn=sys.stdin.fileno()
在主進程中敲寫代碼fn=sys.stdin.fileno(),然后將獲取到的文件描述符fn傳入子進程,子進程敲寫代碼sys.stdin = os.fdopen(fn),然后就可以正常使用sys.stdin.readline()獲取鍵盤輸入了。
代碼示例
import os
import sys
from multiprocessing import Process
def test_input(fn):
sys.stdin = os.fdopen(fn)
info = sys.stdin.readline()
print("start print info!")
print(info)
if __name__ == "__main__":
print("start progress!")
fn = sys.stdin.fileno()
Process(target=test_input, args=(fn, )).start()
結果輸出
start progress!
this is my input.
start print info!
this is my input.
Process finished with exit code 0

浙公網安備 33010602011771號