我想打开终端并使用 python 运行命令。我想运行 rsync 命令并在终端上查看该命令的实时进度。我可以使用 subprocess 并获取 rsync 的输出,但只有在 subprocess 完成后才能获取输出。我想要终端上 rsync
命令的实时进度。
代码:
import subprocess
command = subprocess.Popen(["rsync -apvr source destination --progress"], shell=True, stdout=subprocess.PIPE)
out, err = command.communicate()
谁能告诉我该怎么做?
最佳答案
首先:您不需要需要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
模块来获得“非阻塞读取”等。
关于python - 如何在 python 中打开终端并运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53851521/