Прежде всего: вам не нужно 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
для получения "неблокирующих чтений" и т. Д.