如何 运行 期待使用多处理的等待进程?
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.py
和testPexpectError.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 顶部的异常。
从主线程调用时,不会抛出异常。
我的主要问题是:
当从 multiprocessing.Process 调用 expect 时与在主线程中调用 expect 时相比,是什么导致 pexpect 对 testPexpectError.py 中的等待调用做出反应(如果这甚至是问题)?
有什么办法解决这个问题吗?
请记住,multiprocessing
的主要区别在于它在单独的进程 中生成了一个函数 。
文件描述符不跨进程边界共享(子进程可能会得到父进程文件的 副本,但这是一个可选的每个进程文件标志 -- 参见 https://docs.python.org/3/library/os.html#fd-inheritance 描述接口 Python 放在该层的顶部)。
同样,parent/child 关系仅适用于原始父进程:您可以使用 waitpid()
获取子进程,但不能获取兄弟进程(同一父进程的同胞子进程,即你的 python testPexpectError.py
副本和 multiprocessing
-spawned 子进程的关系在这里。
如果您真的需要在这里使用 multiprocessing
,请将 spawn()
移动到您的 test()
函数中,这样子进程的输出和退出状态就会被其父进程读取(而不是兄弟姐妹),一切都会正常。
我是 运行 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.py
和testPexpectError.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 顶部的异常。 从主线程调用时,不会抛出异常。
我的主要问题是:
当从 multiprocessing.Process 调用 expect 时与在主线程中调用 expect 时相比,是什么导致 pexpect 对 testPexpectError.py 中的等待调用做出反应(如果这甚至是问题)?
有什么办法解决这个问题吗?
请记住,multiprocessing
的主要区别在于它在单独的进程 中生成了一个函数 。
文件描述符不跨进程边界共享(子进程可能会得到父进程文件的 副本,但这是一个可选的每个进程文件标志 -- 参见 https://docs.python.org/3/library/os.html#fd-inheritance 描述接口 Python 放在该层的顶部)。
同样,parent/child 关系仅适用于原始父进程:您可以使用 waitpid()
获取子进程,但不能获取兄弟进程(同一父进程的同胞子进程,即你的 python testPexpectError.py
副本和 multiprocessing
-spawned 子进程的关系在这里。
如果您真的需要在这里使用 multiprocessing
,请将 spawn()
移动到您的 test()
函数中,这样子进程的输出和退出状态就会被其父进程读取(而不是兄弟姐妹),一切都会正常。