Код: Выделить всё
from subprocess import Popen, PIPE
p = Popen("bc -q", shell=True, stdin=PIPE, stdout=PIPE, text=True)
p.stdin.write("1+2\n")
p.stdin.flush()
print(p.stdout.readline().strip()) # outputs: 3
< /code>
это ведет себя как ожидалось. Я отправляю 1+2
Код: Выделить всё
from subprocess import Popen, PIPE
p = Popen(["bc", "-q"], shell=False, stdin=PIPE, stdout=PIPE, text=True)
p.stdin.write("1+2\n")
p.stdin.flush()
print(p.stdout.readline().strip()) # outputs: 1+2
print(p.stdout.readline().strip()) # outputs: 3
Код: Выделить всё
1+2
Код: Выделить всё
3
Почему мне нужно вызовать .ReadLine () дважды, когда Shell = false , но только один раз, когда Shell = true ? Это связано с тем, как оболочка обрабатывает стандартные команды ввода -вывода или эхо? Как я могу надежно подавить входной эхо, если я хочу последовательное поведение? В обоих случаях я ожидал одного и того же поведения: отправьте выражение, подобное 1+2 на BC , и вернуть только результат 3 .
Но то, что я заметил:
- с Shell = true , мне нужно было позвонить. Зачитывает () , чтобы получить результат>, чтобы получить результат>, чтобы получить результат>, чтобы получить результат>, чтобы получить результат. shell = false , первый .чикоизочный () возвращает входную строку (), а второй возвращает результат (
Код: Выделить всё
1+2
).Код: Выделить всё
3
Подробнее здесь: https://stackoverflow.com/questions/797 ... t-only-one