如何 运行 期待使用多处理的等待进程?

How to run pexpect on waited process using multiprocessing?

我是 运行 Python QNX 系统上的 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.pytestPexpectError.py

pexpectTest.py

    import multiprocessing
    import pexpect
    import sys
    
    pexp = pexpect.spawn('python testPexpectError.py')
    pexp.delaybeforesend = False
    pexp.logfile = sys.stdout

    def test():
        pexp.sendline('line')
        pexp.expect('>', timeout=None)
        pexp.close()
    
    mp = multiprocessing.Process(target=test)
    mp.start()
    mp.join()

testPexpectError.py

    import time
    
    while 1:
        input = raw_input(">")
        print input
        
        if input == 'exit':
           break
        
        time.sleep(1)

当从 multiprocessing.Process 调用时,会抛出此 post 顶部的异常。 从主线程调用时,不会抛出异常。

我的主要问题是:

  1. 当从 multiprocessing.Process 调用 expect 时与在主线程中调用 expect 时相比,是什么导致 pexpect 对 testPexpectError.py 中的等待调用做出反应(如果这甚至是问题)?

  2. 有什么办法解决这个问题吗?

请记住,multiprocessing 的主要区别在于它在单独的进程 中生成了一个函数

文件描述符不跨进程边界共享(子进程可能会得到父进程文件的 副本,但这是一个可选的每个进程文件标志 -- 参见 https://docs.python.org/3/library/os.html#fd-inheritance 描述接口 Python 放在该层的顶部)。

同样,parent/child 关系仅适用于原始父进程:您可以使用 waitpid() 获取子进程,但不能获取兄弟进程(同一父进程的同胞子进程,即你的 python testPexpectError.py 副本和 multiprocessing-spawned 子进程的关系在这里。

如果您真的需要在这里使用 multiprocessing,请将 spawn() 移动到您的 test() 函数中,这样子进程的输出和退出状态就会被其父进程读取(而不是兄弟姐妹),一切都会正常。