LINUX.ORG.RU

wait() vs communicate()

 ,


0

2

Через subprocess.Popen вызываем процесс:

command = 'ssh user@host cp src dst'
p = Popen(command, stdin=PIPE, stdout=PIPE)
Далее, используя православный communicate, получаем неуд:
>>> stdout, stderr = p.communicate()
>>> print(stdout, stderr)
None None
А используя wait,
>>> p.wait()
>>> out = p.stdout.read()
>>> print(out)
PROFIT!
Я полагал, что communicate() — это замена wait(), но получается, что есть различия? Или в коде напортачил? Кто-нибудь может объяснить?


"французский не знаю, но по-французски умею"

не знаю я питона, но с высот великого и могучего С могу сказать, что wait тупо ждет завершения процесса.

А зная аглицку мову, могу скаать, что communicate переводится как «общаться». И наверняка еще пожет принимать какой-то параметр (в питоне)

metawishmaster ★★★★★
()

да, не знаю я питона... «The whole purpose of the communicate method is to wait for the process to finish and return all the output»...

metawishmaster ★★★★★
()

На первый взгляд кажется, что ты нас обманываешь и вызываешь Popen с разными аргументами в случае communicate и wait.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Если только меня обманывает моя память.) Но раньше следующего рабочего дня её не проверить. Наверное, существенно также то, что код выполнялся под виндой.

Umpi
() автор топика

Скорее всего ты и вправду где-то напортачил, communicate работает прекрасно:

>>> from subprocess import Popen, PIPE
>>> p = Popen('cat', stdin=PIPE, stdout=PIPE)
>>> stdout, stderr = p.communicate('Hello, World!')
>>> print stdout, stderr
Hello, World! None
>>> 
>>> p = Popen(['echo', 'test'], stdin=PIPE, stdout=PIPE)
>>> stdout, stderr = p.communicate()
>>> print stdout, stderr
test
None
>>> 
theNamelessOne ★★★★★
()
Ответ на: комментарий от theNamelessOne

С простыми командами, конечно, работает. Необычное поведение я пока заметил только при вызове ssh одной строкой. Причём, если линь, заметив такой ввод без shell=True, сразу ругнётся, то винда съедает и при использовании wait() даже выполняет, чего, согласно документации, кажется, быть не должно.

Umpi
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.