Как обрабатывать pexpect.expect с помощью многопроцессорной обработки? - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь запустить команду, которая выводит вывод на консоль и отправляет какой-либо вывод на последовательный порт (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?
...