Python代码调用执行shell踩坑解决

 更新时间:2023年06月12日 09:00:51   作者:大话性能  
这篇文章主要为大家介绍了Python代码调用执行shell,踩过的坑解决方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

背景

在老家 2 天,花了点时间,折腾了下 python 代码,之前一直遇到个偶现点问题,这两天总算解决了。

问题的核心是,你知道怎么正确用 python 代码调用 linux 上的 shell 命令。

这里回涉及 2 个问题。

  • 1、如何执行本机上的 linux 命令?
  • 2、如何执行远程机器上的 linux 命令?

问题一:

可以执行本机 shell 命令的相关 python 模块和函数有好几个,不过有一些已经被废弃或移除。

subprocess 模块用于创建子进程, 这个模块用于替换旧版本中的一些模块, 如:os.system, 

    os.spawn*, os.popen*, os.popen*, popen2., commands., subprocess 允许你能创建很多子进程, 创建的时候能能指定子进程和子进程的输入、输出、错误输出管道, 执行后能获取输出结果和执行状态。

在 python3.5 之后的版本中, 官方文档中提倡通过 subprocess.run() 函数替代其他函数来使用 subprocess 模块的功能。

测试:自己写了个简单的 demo,验证了 subprocess 调用 run 函数执行 linux 命令的时候是阻塞的,一直会等到命令执行完,再往下走。
另外,可以根据结果的 returncode 码,进行判断,linux 命令有没有执行成功。

问题二:

关于 python 远程执行 Linux,用的最多的还是 paramiko 模块,我之前也是用了这个模块,但是踩坑了。

核心主要代码

sshclient = paramiko.SSHClient()
        sshclient.set_missing_host_key_policy(paramiko.AutoAddPolicy())
sshclient.connect(ip, int(port), user, pwd, timeout=60)

check_in, check_out, check_err = sshclient.exec_command(self.check_slave_cmd)

坑就是,exec_command 函数是非阻塞的,不管命令有没有执行成功,python 代码就往下走了。所以,有时候回出现偶像的 bug,因为取决于命令执行的快慢和网速,譬如,假设你执行的 shell 命令耗时比较久,而代码已经执行到下面,发现没有你 shell 命令的结果就报错了。

解决方法

检测一下该 shell 命令的执行状态。调用 recv_exit_status(),该函数回一直阻塞中,直到 shell 命令结束,一般正常接受的 status 是 0.。
所以,当你要用到这个 paramiko 模块执行远程机器的 shell 命令的话,要多个心眼,保证 shell 命令有没有执行完成,会不会影响你的代码。

以上就是Python 代码调用执行 shell,踩过的坑的详细内容,更多关于Python调用执行shell踩坑的资料请关注脚本之家其它相关文章!

相关文章

  • python 获取utc时间转化为本地时间的方法

    python 获取utc时间转化为本地时间的方法

    今天小编就为大家分享一篇python 获取utc时间转化为本地时间的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Django的session中对于用户验证的支持

    Django的session中对于用户验证的支持

    这篇文章主要介绍了Django的session中对于用户验证的支持,Django是百花齐放的Python框架中人气最高的一个,需要的朋友可以参考下
    2015-07-07
  • 使用PyQt5设计GUI实现程序图形界面设计

    使用PyQt5设计GUI实现程序图形界面设计

    当我们学会如何在pycharm中配置pyqt5设计GU之后,那么本文来带你熟悉PyQt5设计GUI流程并为程序设计图形界面,设计一个属于自己的GUI
    2021-08-08
  • python中利用zfill方法自动给数字前面补0

    python中利用zfill方法自动给数字前面补0

    python中有一个zfill方法用来给字符串前面补0,非常不错,下面小编给大家分享了实例代码,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-04-04
  • Python中pygal绘制雷达图代码分享

    Python中pygal绘制雷达图代码分享

    这篇文章主要介绍了Python中pygal绘制雷达图代码分享,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • 关于如何使用python的gradio库

    关于如何使用python的gradio库

    这篇文章主要介绍了关于如何使用python的gradio库,Gradio是一个功能丰富的Python库,可以让您轻松创建和共享自己的交互式机器学习和深度学习模型,需要的朋友可以参考下
    2023-04-04
  • Python+Tkinter制作在线个性签名工具

    Python+Tkinter制作在线个性签名工具

    这篇文章主要为大家分享如何利用Python中的Tkinter库制作一个简易的在线个性签名生成工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-03-03
  • Python爬虫获取AliExpress商品详情的详细步骤

    Python爬虫获取AliExpress商品详情的详细步骤

    速卖通(AliExpress)是全球知名的在线零售平台,隶属于阿里巴巴集团,下面给大家介绍如何使用Python进行这一操作的详细步骤,感谢的朋友一起看看吧
    2024-12-12
  • python实现希尔密码加密的示例代码

    python实现希尔密码加密的示例代码

    本文主要介绍了python实现希尔密码加密,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • Python内置函数之tuple()与type()的实用指南

    Python内置函数之tuple()与type()的实用指南

    这篇文章主要介绍了Python中的两个重要内置函数:tuple()和type(),tuple()用于创建不可变序列,适合数据保护和多返回值;type()用于类型检测和动态类创建,是元编程的核心,文章还提供了组合应用示例和高级技巧与最佳实践,需要的朋友可以参考下
    2026-01-01

最新评论