Python2: запись в stdin интерактивного процесса с использованием Popen.communicate (), без завершающей строки - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь написать, как мне кажется, простой служебный скрипт для вызова другой команды, но Popen.communicate (), похоже, добавляет новую строку.Я предполагаю, что это завершает ввод, и он работает с базовым сценарием, который принимает ввод и распечатывает его, но вызывает проблемы, когда другая программа является интерактивной (например, bc).

Минимальнаякод для воспроизведения, используя bc вместо другой программы (поскольку обе они интерактивны, решение проблемы с bc должно решить проблему):

#!/usr/bin/env python
from subprocess import Popen, PIPE

command = "bc"
p = Popen(command, stdin=PIPE, stdout=PIPE, stderr=PIPE)
stdout_data = p.communicate(input="2+2")
print(stdout_data)

Это печатает ('', '(standard_in) 1: syntax error\n'), предположительно вызванное приложеннойсимвол новой строки, так как по той же строке передается в bc в оболочке, echo "2+2" | bc, печатается 4 очень хорошо.

Возможно ли использовать Popen.communicate () без добавления новой строки, или мне нужноиспользовать другой метод?

1 Ответ

0 голосов
/ 10 декабря 2018

Я думаю, что я идиот, потому что решение было противоположным тому, что я думал: добавление новой строки к вводу: stdout_data = p.communicate(input="2+2\n") заставляет скрипт печатать ('4\n', ''), как следует, а не выдавать ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...