大佬教程收集整理的这篇文章主要介绍了Python子流程.check_call与.check_output,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
check_call()``/bin/sh
进程退出后立即返回,而无需等待后代进程(假设sHell=True
与您的情况相同)。
check_output()
等待直到读取所有输出。如果ssh
继承管道,则check_output()
它将等待直到退出(直到关闭其继承的管道末端)。
#!/usr/bin/env python
import subprocess
import sys
import time
start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' &"
subprocess.check_call(cmd, sHell=TruE)
assert (time.time() - start) < 1
不读取输出;check_call()
立即返回,而无需等待孙子后台python进程。
check_call()
就是Popen().wait()
。Popen()
启动外部进程并立即返回,而无需等待其退出。.wait()
收集进程的退出状态-
它不等待其他(孙代)进程。
如果读取了输出(重定向并孙子python进程继承了stdout管道):
start = time.time()
subprocess.check_output(cmd, sHell=TruE)
assert (time.time() - start) > 2
然后等待直到继承管道的后台python进程退出。
check_output()
调用Popen().communicate()
,以获取输出。内部.communicate()
调用,.wait()
即check_output()
也等待外壳退出并check_output()
等待EOF。
如果孙子不继承管道,则check_output()
不要等待它:
start = time.time()
cmd = sys.executable + " -c 'import time; time.sleep(2)' >/dev/null &"
subprocess.check_output(cmd, sHell=TruE)
assert (time.time() - start) < 1
孙子的输出被重定向到/dev/null
即不继承父管道的输出,因此check_output()
可以不等待而退出。
注意:&
最后将孙子python进程置于后台。在默认情况下sHell=True
启动cmd.exe
的windows上,它将无法使用。
我的python脚本(python 3.4.3)通过子进程调用bash脚本:
import subprocess as sp
res = sp.check_output("bashscript",sHell=TruE)
该 bashscript 包含以下行:
ssh -MNf somehost
这将打开与某个远程主机的共享主连接,以允许进行一些后续操作。
执行python脚本时,它将提示输入该ssh
行的密码,但是在输入密码后它将阻塞,并且永远不会返回。当我按ctrl-
C终止脚本时,我看到连接已正确建立(因此ssh
行已成功执行)。
使用check_call
代替时check_output
,我没有此阻塞问题,但check_call
不检索标准输出。我想了解到底是什么导致了阻止行为check_output
,可能与的一些微妙之处有关ssh
-MNf
。
以上是大佬教程为你收集整理的Python子流程.check_call与.check_output全部内容,希望文章能够帮你解决Python子流程.check_call与.check_output所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。