程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Python子流程.check_call与.check_output大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Python子流程.check_call与.check_output?

开发过程中遇到Python子流程.check_call与.check_output的问题如何解决?下面主要结合日常开发的经验,给出你关于Python子流程.check_call与.check_output的解决方法建议,希望对你解决Python子流程.check_call与.check_output有所启发或帮助;

check_call()``/bin/sh进程退出后立即返回,而无需等待后代进程(假设sHell=True与您的情况相同)。

check_output()等待直到读取所有输出。如果ssh继承管道,则check_output()它将等待直到退出(直到关闭其继承的管道末端)。

check_call() 代码示例:

#!/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,请注明来意。