我在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
<>以前进口多处理进口pexpect导入系统Pexp = pexpect。产卵("python testPexpectError.py")pexpe . delaybeforeend = Falsepexp。Logfile = sys.stdoutdef测试():pexp.sendline("行")pexp。期望(">",超时=没有)pexp.close ()mp = multiprocessing.Process(目标=test)mp.start ()mp.join ()testPexpectError.py
<>之前导入时间而1:Input = raw_input(">")打印输入如果input == 'exit':打破time.sleep(1)从多进程调用时。过程中,抛出本文顶部的异常。当从主线程调用时,不会抛出异常。
我的主要问题是:
当从多进程中调用expect时,是什么导致pexpect对testPexpectError.py中的wait调用做出反应?进程vs当期望在主线程中被调用(如果这甚至是问题)?
有什么办法吗?
请记住,multiprocessing
的关键区别特征是它在一个单独的进程中生成一个函数。
文件描述符不能跨进程边界共享(子进程可以获得父进程fd的副本,但这是可选的每个fd标志——参见https://docs.python.org/3/library/os.html#fd-inheritance描述Python在该层之上的接口)。
同样,父/子关系仅适用于原始父进程:您可以使用waitpid()
来获取子进程,但不能获取兄弟进程(同一父进程的同伴子进程,这是您的python testPexpectError.py
副本和multiprocessing
派生的子进程在这里具有的关系)。
如果您确实需要在这里使用multiprocessing
,请将spawn()
移动到test()
函数中,这样子进程的输出和退出状态将由其父进程读取(而不是由兄弟进程),并且一切都将正常工作。