python - 如何在 python 中打开终端并运行命令?

标签 python subprocess

我想打开终端并使用 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/

相关文章:

python - Django 或 Python 中的数据库报告服务

python - 将用户 ID 的类型更改为 UUID

python - 忽略 subprocess.Popen 的输出

python - 在长子进程调用(python)中使用 PIPE 不起作用

java - 安装了两个版本的 Java 时出现错误 Python tabula

python - 旋转纬度 (y) 刻度标签 - cartopy

python - 向尚无后缀的列名称添加后缀

Python openCv 等高线

python - 在 python 中处理 tcpdump 输出

python - 如何使用子进程在当前激活的 virtualenv 中运行 python 代码?