请注意:我有一个后续问题,请参考此处更新的code。
下面只是我希望精简并了解如何做得更好的代码的一部分。
import subprocess
cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz --exclude %s %s@%s:%s %s/"%(args.exclude,rsync_user,host,args.source,dest_dir)
cmd_content = cmd
p = subprocess.Popen(cmd,shell=True)
p.wait()
print("DONE")
return cmd_content + " Rsync process completed."
我期望从脚本中捕获stdout
和stderr
并将其捕获到变量中,因此,我可以使用它并将其作为电子邮件附件发送。
因此,在这里重构上面的代码,我显式地导入了Popen
和PIPE
,但是,我已经使用了p.communicate()
,因为我看到Popen.communicate()
与流程和发送交互数据到stdin,从stdout和stderr读取数据,直到到达文件末尾,它还等待进程终止。
from subprocess import Popen, PIPE
cmd = "rsync -e 'ssh -o StrictHostKeyChecking=no' -auPz --exclude %s %s@%s:%s %s/"%(args.exclude,rsync_user,host,args.source,dest_dir)
cmd_content = cmd
p = Popen(cmd,stdout=PIPE,shell=True)
p.communicate()
print("DONE")
return cmd_content + " Rsync process completed."
我看到Python 2.7及更高版本还支持subprocess.check_output()
,因此,我们可以避免直接使用Popen对象,而可以使用subprocess.check_output()函数将命令的输出存储在字符串中,如下所示,但我怀疑这样做会不会就我而言,因为我正在使用cmd
变量来传递为shell=True
。
>>> from subprocess import check_output
>>> out = check_output(cmd)
我在网上和SO处浏览了子流程示例和问题,但未获得所需的信息。