python子进程将stdin和stdout捕获到变量中

时间:2018-09-19 15:00:11

标签: python subprocess pipe python-3.6 popen

请注意:我有一个后续问题,请参考此处更新的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."

我期望从脚本中捕获stdoutstderr并将其捕获到变量中,因此,我可以使用它并将其作为电子邮件附件发送。

因此,在这里重构上面的代码,我显式地导入了PopenPIPE,但是,我已经使用了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处浏览了子流程示例和问题,但未获得所需的信息。

0 个答案:

没有答案