Я пытаюсь запустить команду, которая выводит вывод на консоль и отправляет какой-либо вывод на последовательный порт (USB0).
На основе вывода из обоих мест мне нужно решить, какойпуть, чтобы взять и продолжить программу.Я хотел бы добиться этого с помощью pexpect, так как мне нужно добавить тайм-аут и искать список строк.
Мое намерение состоит в том, чтобы параллельно запускать команды pexpect.expect для разных экземпляров pexpect.
Я попытался создать минимизированный тест-кейс для этого сценария.
Пример 1: Это то, что я ожидаю сделать.
def run_cmd(a, host, rt):
b = a.expect([pexpect.EOF, pexpect.TIMEOUT, host])
rt[host] = b
if __name__ == '__main__':
jobs = []
rt = multiprocessing.Manager().dict()
host = 'a.b.c.d'
a = pexpect.spawn("ssh %s" % host)
p = multiprocessing.Process(target=run_cmd, args=(a, host, rt))
jobs.append(p)
p.start()
for proc in jobs:
proc.join()
pprint(rt.values())
Пример 2: Это работаети я не могу запустить spawn для каждого вызова.
def run_cmd(host, rt):
a = pexpect.spawn("ssh %s" % host)
b = a.expect([pexpect.EOF, pexpect.TIMEOUT, host])
rt[host] = b
if __name__ == '__main__':
jobs = []
rt = multiprocessing.Manager().dict()
p = multiprocessing.Process(target=run_cmd, args=('a.b.c.d', rt))
jobs.append(p)
p.start()
for proc in jobs:
proc.join()
pprint(rt.values())
Пример Ex-1, приведенный выше, приводит к следующей ошибке.
Process Process-2:
Traceback (most recent call last):
File "/proj/sival2/ctallapa/tools/apps/Anaconda3/5.3.0/lib/python3.7/site-packages/ptyprocess/ptyprocess.py", line 705, in isalive
pid, status = os.waitpid(self.pid, waitpid_options)
ChildProcessError: [Errno 10] No child processes
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/proj/sival2/ctallapa/tools/apps/Anaconda3/5.3.0/lib/python3.7/site-packages/pexpect/pty_spawn.py", line 23, in _wrap_ptyprocess_err
yield
File "/proj/sival2/ctallapa/tools/apps/Anaconda3/5.3.0/lib/python3.7/site-packages/pexpect/pty_spawn.py", line 682, in isalive
alive = ptyproc.isalive()
File "/proj/sival2/ctallapa/tools/apps/Anaconda3/5.3.0/lib/python3.7/site-packages/ptyprocess/ptyprocess.py", line 711, in isalive
'process. Did someone else call waitpid() ' +
ptyprocess.util.PtyProcessError: isalive() encountered condition where "terminated" is 0, but there was no child process. Did someone else call waitpid() on our process?