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

时间:2018-12-19 12:42:59

标签: python subprocess

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

首先:您不需要需要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

根据确切的操作,您可能想使用var requestParamsFormUrlEncoded = new FormUrlEncodedContent(requestParams); var tokenServiceResponse = await httpclient.PostAsync(tokenServiceUrl, requestParamsFormUrlEncoded); var responseString = await tokenServiceResponse.Content.ReadAsStringAsync(); 模块来获取“非阻塞读取”等。