Странное поведение Python при вызове Popen и записи в stdin - PullRequest
0 голосов
/ 15 июня 2011

Два (связанных?) Вопроса здесь.

Я пытался написать программу для запуска внешнего процесса, а затем одновременно прочитать из stdout и записать в stdin. Казалось, что все работает, но процесс не отвечает на данные, отправленные на его стандартный канал. Вы знаете, почему это будет? (1)

Этот второй вопрос уже решен.

Я написал два сценария тестирования, первый был таким:

# recv.py
while True:
    print(input())

Второй был разработан для вызова другого с использованием Popen, чтобы дать ему произвольный ввод:

# send.py
recv = subprocess.Popen(["python", "recv.py"], stdin=subprocess.PIPE)
recv.stdin.write(b"Hello\n")
recv.stdin.write(b"World.\n")

Вот что я получил, когда запустил:

skyler@pro:testing$ python send.py 
skyler@pro:testing$ Traceback (most recent call last):
  File "recv.py", line 30, in <module>
    main()
  File "recv.py", line 26, in main
    print(input())
  File "<string>", line 1, in <module>
NameError: name 'Hello' is not defined

По какой-то причине похоже, что результат input() обрабатывается как часть строки, а не как строка, действительно, когда я устанавливаю переменную Hello в recv.py, он печатает содержимое Hello. Почему это происходит? (2)

Я использую Python 3.1.2 на Mac OSX.

Ответы [ 2 ]

3 голосов
/ 15 июня 2011

То, что вы видите, - это ожидаемое поведение функции input() Python 2.x, которая берет строку из sys.stdin (например, raw_input()) и затем оценивает ее как код Python .Обычно плохая идея использовать input() в Python 2.x :) В Python 3.x input() было удалено и raw_input() было переименовано в input(), что может быть причиной того, что вы не понимаете, что это такоеделает.

Вы не запускаете Python 3.x, даже если он у вас установлен.Команда python, вероятно, (надеюсь!) Все еще является установленным системой Python 2.x.Попробуйте запустить его с python3 или python3.1.

2 голосов
/ 15 июня 2011

Убедитесь, что вы на самом деле работаете с Python 3?Это выглядит подозрительно как поведение Python 2.x input(), где оно будет интерпретировать ввод как выражения Python (в отличие от raw_input(), который стал input() * в Python 3).

...