2

Есть скрипт p = subprocess.Popen('ssh 168.0.0.1 python subscribe.py command', shell=True) он поднимает скрипт питоновский subscribe.py, который в цикле возвращает данные без конца.

Как то можно не ожидать выполнение процесса, тем более он бесконечен, а получать данные от него?

gil9red
  • 77,085

1 Answers1

3
#!/usr/bin/env python3
import sys
from subprocess import Popen, PIPE

with Popen([sys.executable, '-u', 'child.py'],
           stdout=PIPE, universal_newlines=True) as process:
    for line in process.stdout:
        print(line.replace('!', '#'), end='')

child.py:

#!/usr/bin/env python3
import time

for _ in range(5): print('!!!') time.sleep(1)

print('Exit. Конец!')

Консоль:

###
###
###
###
###
Exit. Конец#
gil9red
  • 77,085
  • 1- указывайте #!/usr/bin/env python3 для исходного кода на Питоне 3 (как в вашем примере) 2- не нужно декларацию кодировки coding: utf-8 в Питоне 3 использовать (utf-8 и так кодировка по умолчанию) 3- не нужно shell=True использовать (меньше шансов что зловредную команду ваш код выполнит). OP может напрямую ssh вызвать без запуска оболочки. 4- не нужно stdin=PIPE использовать, если вы ничего не пишете в соответствующую pipe. 5- Используйте universal_newlines=True и print(line, end='') чтобы текст отобразился. 6- избегайте локально Питон-скрипты как subprocess запускать, лучше ... – jfs Feb 29 '16 at 17:08
  • ... [продолжение] вместо этого импортируйте файл как модуль и вызовите соответствующие функции. See Call python script with input with in a python script using subprocess 7- возможно ещё надо -u опцию передать дочерней python команде -- иначе вывод родителю во время не дойдёт. – jfs Feb 29 '16 at 17:12
  • Спасибо за советы, подправил – gil9red Feb 29 '16 at 18:03
  • 1- universal_newlines=Trueвключает текстовый режим в Питоне 3. Если вы не понимаете разницу между текстом (Юникодная строка) и двоичными данными (байтами), посмотрите [этот ответ](http://ru.stackoverflow.com/a/497719/23044) 2- можно использоватьfor _ in range(5):`, чтобы повторить что-то пять раз – jfs Feb 29 '16 at 18:05
  • всё ещё -u не хватает, чтобы сразу вывод показывался – jfs Feb 29 '16 at 18:11
  • поправил код, чтобы показать как он может выглядить, если все замечания учесть. – jfs Feb 29 '16 at 21:01
  • понятно, узнал новое – gil9red Mar 01 '16 at 05:25