Subprocess.Popen: процесс завершается при тривиальной ошибкеPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Subprocess.Popen: процесс завершается при тривиальной ошибке

Сообщение Anonymous »

Я работаю над приложением, которое требует диалогового взаимодействия с внешним процессом, моделируемого здесь с помощью терминала-калькулятора bc: я отправляю что-то на стандартный ввод и получаю ответ через стандартный вывод или стандартный поток ошибок, если возникает ошибка. Однако процесс завершается при возникновении нефатальной ошибки.
Ниже приведен фрагмент ztui.py, воспроизводящий проблему. Вместо перехода к следующему вводу stdin процесс просто неожиданно завершает работу после печати на stderr, и программа Python получает ошибку BrokenPipeError, когда пытается отправить/сбросить третью команду как он явно закрыт.

Код: Выделить всё

from subprocess import Popen, PIPE

proc = Popen(["bc"], stdin=PIPE, stdout=PIPE, stderr=PIPE)

proc.stdin.write(b"2+2\n")
proc.stdin.flush()
print(proc.stdout.readline().decode())

proc.stdin.write(b"len()\n")
proc.stdin.flush()
print(proc.stdout.readline().decode())
print("stderr ==>", proc.stderr.readlines(2))

# and here the proc exits, checked using ps aux from another terminal window

proc.stdin.write(b"3+3\n")
proc.stdin.flush()
print(proc.stdout.readline().decode())
Это результат

Код: Выделить всё

fabio: ~/Downloads $ python3.11 --version
Python 3.11.3
fabio: ~/Downloads $ python3.11 ztui.py
4

stderr ==> [b'\n', b'Runtime error: undefined function: len()\n']
Traceback (most recent call last):
File "/Users/fabio/Downloads/ztui.py", line 15, in 
proc.stdin.flush()
BrokenPipeError: [Errno 32] Broken pipe
Излишне говорить, что настоящая программа bc не завершает работу при передаче len(): она просто показывает ошибку и готовится к новому вводу< /p>

Код: Выделить всё

fabio: ~/Downloads $ bc
>>> 2*2
4
>>> len()

Runtime error: undefined function: len()
0: (main)

>>> 3*3
9
>>> quit
Как это устранить? Изначально я рассматривал команду communication(), но она предназначена для разового запроса, и мне нужно постоянно отправлять и получать команды и ответы.


Подробнее здесь: https://stackoverflow.com/questions/793 ... vial-error
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»