【发布时间】:2021-12-05 21:55:10
【问题描述】:
我在 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('行') pexp.expect('>', timeout=None) pexp.close() mp = multiprocessing.Process(目标=测试) mp.start() mp.join()testPexpectError.py
进口时间 而1: 输入 = raw_input(">") 打印输入 如果输入 == '退出': 休息 时间.sleep(1)当从 multiprocessing.Process 调用时,本文顶部的异常会被抛出。 从主线程调用时,不会抛出异常。
我的主要问题是:
-
当从 multiprocessing.Process 调用期望与在主线程中调用期望时(如果这甚至是问题),是什么导致 pexpect 对 testPexpectError.py 中的等待调用做出反应?
-
有没有办法解决这个问题?
【问题讨论】:
-
为什么要为此使用多处理?等待子进程写入输出不持有 GIL;您可以使用线程来以更低的开销实现相同的目标。
-
基本上,您的直接问题是因为您生成的程序是试图读取其输出的进程的兄弟,而不是子进程。这意味着不可继承的文件描述符全部丢失在边界中,并且您不能使用
waitsyscall 系列来检索退出状态。 -
@CharlesDuffy 感谢您的意见。对于上下文:这只是我遇到的问题的一个超简化示例,我想了解更多。存在此问题的实际系统要复杂得多,因此它不能使用任何类型的线程,必须使用多处理。
-
明白了。既然如此,我添加了一个涵盖“重组代码以使多处理工作”的答案,同时希望能比上述 cmets 更好地说明“为什么”。
标签: python python-2.7 multiprocessing pexpect qnx