Как открыть терминал и запустить команду к нему в python? - PullRequest
0 голосов
/ 19 декабря 2018

Я хочу открыть терминал и запустить команду, используя python.Я хочу выполнить команду rsync и посмотреть ее выполнение в терминале.Я могу использовать подпроцесс и получить вывод rsync, но я могу получить вывод только после завершения подпроцесса.Я хочу, чтобы в режиме реального времени выполнялась команда rsync на терминале.

Код:

import subprocess

command = subprocess.Popen(["rsync -apvr source destination --progress"], shell=True, stdout=subprocess.PIPE)

out, err = command.communicate()

Может кто-нибудь сказать мне, как это сделать?

1 Ответ

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

Прежде всего: вам не нужно shell=True.Используйте это вместо:

subprocess.Popen(["rsync", "-apvr", "source", "destination", "--progress"], stdout=subprocess.PIPE)

Или, если вы не хотите вручную разбивать командную строку:

import shlex

subprocess.Popen(shlex.split("rsync -apvr source destination --progress"), stdout=subprocess.PIPE)

Секунда: communicate ожидает окончания процесса.Если вы хотите фактически смешать вывод подпроцесса с текущим процессом, вы можете просто не указывать stdout=subprocess.PIPE, или, возможно, вы можете указать stdout=sys.stdout, если хотите быть явным:

import sys

subprocess.Popen(["rsync", "-apvr", "source", "destination", "--progress"], stdout=sys.stdout)

это будетвыведите вывод rsync в стандартный поток вашего процесса.

Если вместо этого вы захотите проанализировать вывод «в реальном времени», вам придется использовать stdout=subprocess.PIPE и читать из Popen.stdout вручную:

proc = subprocess.Popen(["rsync", "-apvr", "source", "destination", "--progress"], stdout=sys.stdout)

for line in proc.stdout:
    do_something(line)

В зависимости от того, что именно вы хотите сделать, вы можете использовать модуль select для получения "неблокирующих чтений" и т. Д.

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