一些经验法则
subprocess。
- 永远不要使用
shell=True
。它不必要地调用额外的shell进程来调用您的程序。 - 调用进程时,参数作为列表传递。sys.argv在python中是一个列表,argv在C中也是如此。因此,您将* * 列表传递给Popen来调用子流程,而不是字符串。
- 不阅读时不要重定向stderr到a PIPE。
- stdin不写时不要重定向。
- 例:
import subprocess, time, os, syscmd = ["rsync.exe", "-vaz", "-P", "source/" ,"dest/"]p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)for line in iter(p.stdout.readline, b''): print(">>> " + line.rstrip())
也就是说,当rsync检测到它连接到管道而不是终端时,可能会缓冲其输出。这是默认行为-连接到管道时,程序必须显式刷新stdout以获得实时结果,否则标准C库将缓冲。
要对此进行测试,请尝试运行以下命令:
cmd = [sys.executable, 'test_out.py']
并创建一个test_out.py包含以下内容的文件:
import sysimport timeprint ("Hello")sys.stdout.flush()time.sleep(10)print ("World")
执行该子流程应该会给您“ Hello”,并等待10秒钟后才能给出“ World”。如果上述情况发生在上面的python代码上,而不是发生rsync,则意味着rsync它本身正在缓冲输出,因此您很不走运。
一种解决方案是pty使用类似的方法直接连接到
pexpect。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)