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

2024-06-16 11:22:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想打开一个终端并使用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()

有人能告诉我怎么做吗?你知道吗


Tags: 代码import命令true终端sourcestdoutshell
1条回答
网友
1楼 · 发布于 2024-06-16 11:22:03

首先:你不需要。改用这个:

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模块来获得“非阻塞读取”等

相关问题 更多 >