Я пытаюсь работать с pexpect
до порождения дочернего процесса другой Python программы. Предполагается, что требуемая операция займет очень долго (даже 5 минут), поэтому я хочу, чтобы мой родительский процесс не завершал дочерний процесс, а вместо этого ждал полного завершения задачи. По завершении задачи родительский процесс должен печатать в стандартном выводе все выходные данные, которые печатал бы дочерний процесс.
child = pexpect.spawn('python3 /home/robb/Workspace/prog1.py')
# [...] some input-output ipc correctly working
# The final request from prog1:
child.expect(".*phrase:")
child.sendline(answer) # Answer is a string
print("DEBUG 1 ##############################")
print(child.after.decode('ascii'))
# Here prog1 should be working for long
# Its last sentence should be like "Found 15 products"
child.expect(".*products")
print("DEBUG 2 ##############################")
print(child.after.decode('ascii'))
print("Work terminated. Closing child process.")
child.close()
Вывод, который я получаю, следующий:
DEBUG 1 ##############################
10
Input search phrase:
10
является ответом на предыдущий вопрос, поэтому, насколько я понял, он просто был помещен в буфер и отправлен в печать, которую я написал прямо под печатью «DEBUG 1». Но почему я не получаю какой-либо из следующих выводов, которые мне бы хотелось? Программа останавливается на child.expect(".*products")
, по-видимому. Что может быть не так?
РЕДАКТИРОВАТЬ: вот что я получаю при стандартной ошибке
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pexpect/expect.py", line 111, in expect_loop
incoming = spawn.read_nonblocking(spawn.maxread, timeout)
File "/usr/lib/python3/dist-packages/pexpect/pty_spawn.py", line 482, in read_nonblocking
raise TIMEOUT('Timeout exceeded.')
pexpect.exceptions.TIMEOUT: Timeout exceeded.
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "prog2.py", line 39, in <module>
child.expect(".*products")
File "/usr/lib/python3/dist-packages/pexpect/spawnbase.py", line 341, in expect
timeout, searchwindowsize, async_)
File "/usr/lib/python3/dist-packages/pexpect/spawnbase.py", line 369, in expect_list
return exp.expect_loop(timeout)
File "/usr/lib/python3/dist-packages/pexpect/expect.py", line 119, in expect_loop
return self.timeout(e)
File "/usr/lib/python3/dist-packages/pexpect/expect.py", line 82, in timeout
raise TIMEOUT(msg)
pexpect.exceptions.TIMEOUT: Timeout exceeded.
<pexpect.pty_spawn.spawn object at 0x7f7a9a745710>
command: /usr/bin/python3
args: ['/usr/bin/python3', '/home/robb/Workspace/prog1.py']
buffer (last 100 chars): b'\n103.220.207.242:54349.....FAILED\r\n41.190.147.158:49088.....PASSED\r\n183.88.213.25:50440.....FAILED\r\n'
before (last 100 chars): b'\n103.220.207.242:54349.....FAILED\r\n41.190.147.158:49088.....PASSED\r\n183.88.213.25:50440.....FAILED\r\n'
after: <class 'pexpect.exceptions.TIMEOUT'>
match: None
match_index: None
exitstatus: None
flag_eof: False
pid: 14257
child_fd: 5
closed: False
timeout: 30
delimiter: <class 'pexpect.exceptions.EOF'>
logfile: None
logfile_read: None
logfile_send: None
maxread: 2000
ignorecase: False
searchwindowsize: None
delaybeforesend: 0.05
delayafterclose: 0.1
delayafterterminate: 0.1
searcher: searcher_re:
0: re.compile(b'.*products')