我想打开一个终端并使用python运行命令。我想运行rsync
命令,并在终端上查看该命令的实时进度。我可以使用子流程并获取rsync
的输出,但是只有在子流程完成后才能获取输出。我想要终端上rsync
命令的实时进度。
代码:
import subprocess
command = subprocess.Popen(["rsync -apvr source destination --progress"], shell=True, stdout=subprocess.PIPE)
out, err = command.communicate()
谁能告诉我该怎么做?
答案 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();
模块来获取“非阻塞读取”等。