Pexpect: дождаться завершения процесса - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь работать с 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')
...