百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

使用python自动化脚本执行shell命令,提前两小时下班(5)

off999 2024-10-11 14:05 32 浏览 0 评论

今天我们来学习如何通过python脚本执行linux 操作系统命令,通过前面几期的学习,我们基本已经可以控制操作系统的目录和文件,切换到特定路径下,获取系统环境变量,获取用户命令行变量,跟用户进行入参交互。通过正则表达式过滤和加工我们需要的数据。

这次,我们来补遗,再次讲讲如何使用python脚本执行Linux shell脚本命令。

有同学可能要问了,我直接写shell 不就完了,为啥需要多此一举用python调用shell呢?

python 的优势在哪里?

  1. python 编码调试更加容易,灵活性更高,变量有一定的类型。
  2. python 更加适合大规模,模块化的自动化脚本编写。

因此,目前工作中,涉及自动化脚本的场景,多用python替代shell。

于是,使用python执行shell命令,就是替换中的关键功能了,实际上前面有一期已经给大家介绍了四种python执行shell脚本命令的方式。

本次,我们聚焦于subprocess 这种官方推荐的形式,并给大家及进行详细介绍。

先看一个简单的示例:

import subprocess
>>> subprocess.run(["date"])
Fri Mar 22 21:16:26 CST 2024
// 通过python执行date shell命令,结果打印
CompletedProcess(args=['date'], returncode=0)
// 返回了一个CompletedProcess对象
// 可以看到返回值returncode 为0
// 代表正确执行返回

如果我们执行的语句出现错误会发生什么呢?

>>> result = subprocess.run(["ls", "file_not_exists"])
ls: cannot access 'file_not_exists': No such file or directory
>>> print(result.returncode)
2 // 我们发现,执行ls指令,失败后返回非0值

上面的一些shell命令,包括chmod, ls, date 等,我们一般只关心这些命令调用后是否成功,我们不需要对执行结果进行进一步处理时,直接判断执行返回值的returncode是否为0就足够了。

但是如果有一些shell命令,我们执行后,需要对执行结果进行进一步过滤,处理,获取一些有用信息时,那么上面的方式就不适用了。

那应该怎么办呢?

>>> result =
subprocess.run(["host", "8.8.8.8"], stdout=subprocess.PIPE)
>>> print(result.returncode)
0
>>> print(result.stdout)
b'8.8.8.8.in-addr.arpa domain name pointer dns.google.\n'
// 我们可以使用stdout属性或者capture_out=True
// 然后通过result.stdout获取到执行结果

host可以根据入参的ip地址,进行域名获取功能。

这里有个小tips,大家知道那个stdout显示结果的字符串前面为啥有个b不?

其实这代表的是,这个字符串它不是一个python标准的字符串,而是字节数组类型。

如果想进一步获取到python标准的字符串,可以使用decode方法。

>>> ret_list = result.stdout.decode().split()
// decode 之后split,存储为列表
>>> print(ret_list)
['8.8.8.8.in-addr.arpa', 'domain', 'name', 'pointer', 'dns.google.']
// 打印结果

那么如果我们执行某个shell指令错误,如何获取错误结果呢?答案是使用stderr。

示例如下:

>>> result = subprocess
 .run(["rm", "does_not_exists"],
 stderr=subprocess.PIPE, stdout=subprocess.PIPE)
// 想删除一个不存在的文件
>>> print(result.returncode)
1
>>> print(result.stdout)
b'' 
// 执行结果为空,因为出现错误了
>>> print(result.stderr)
b"rm: cannot remove 'does_not_exists': No such file or directory\n"
// 打印错误结果在stderr中

然后我们在学会了上面的基础使用方法后,考虑一种场景。

场景示例:

  1. 我们想执行一个自己的二进制程序,需要把这个程序的可执行文件路径添加到操作系统的环境变量中去。

如何实现这个功能呢?

示例如下:

>>> import os
>>> import subprocess
>>> my_env_to_run_app = os.environ.copy()
>>> my_env_to_run_app
= os.pathsep.join(["/opt/myapp/", 
my_env_to_run_app["PATH"]])
>>> result = subprocess.run(["myapp"], env = my_env_to_run_app)

我们通过os.environ.copy做环境变量的拷贝,然后添加自己的环境变量进去,然后在subprocess执行时,指定环境变量即可。

需要注意的是,subprocess 默认是启动了一个子线程去执行shell命令的,从上面的copy环境变量也可以看出,如果想执行一些命令直接作用在当前shell 中,则必须指定shell。

我们证明一下这件事情:

result = subprocess.run(["export", "Fruit=Apple"], shell=True)
// 导出一个环境变量Fruit
>>> print(result.returncode)
0 // 执行成功
>>> print(os.environ["LOGNAME"])
chen // 正常系统环境变量
>>> print(os.environ["Fruit"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.6/os.py", line 669, in __getitem__
    raise KeyError(key) from None
KeyError: 'Fruit'
// 发现通过subprocess export
// 的变量不在当前shell中,无法获取到

好的,今天就先讲到这里,你的关注就是我分享的动力,希望大家关注并给我留言,任何想听的想看的,都可以留言告诉我,给大家分享。

相关推荐

全网第一个讲清楚CPK如何计算的Step by stepExcel和Python同时实现

在网上搜索CPK的计算方法,几乎全是照搬教材的公式,在实际工作做作用不大,甚至误导人。比如这个又比如这个:CPK=min((X-LSL/3s),(USL-X/3s))还有这个,很规范的公式,也很清晰很...

[R语言] R语言快速入门教程(r语言基础操作)

本文主要是为了从零开始学习和理解R语言,简要介绍了该语言的最重要部分,以快速入门。主要参考文章:R-TutorialR语言程序的编写需要安装R或RStudio,通常是在RStudio中键入代码。但是R...

Python第123题:计算直角三角形底边斜边【PythonTip题库300题】

1、编程试题:编写一个程序,找出已知面积和高的直角三角形的另外两边(底边及斜边)。定义函数find_missing_sides(),有两个参数:area(面积)和height(高)。在函数内,计算另外...

Tensor:Pytorch神经网络界的Numpy

TensorTensor,它可以是0维、一维以及多维的数组,你可以将它看作为神经网络界的Numpy,它与Numpy相似,二者可以共享内存,且之间的转换非常方便。但它们也不相同,最大的区别就是Numpy...

python多进程编程(python多进程进程池)

forkwindows中是没有fork函数的,一开始直接在Windows中测试,直接报错importosimporttimeret=os.fork()ifret==0:...

原来Python的协程有2种实现方式(python协程模型)

什么是协程在Python中,协程(Coroutine)是一种轻量级的并发编程方式,可以通过协作式多任务来实现高效的并发执行。协程是一种特殊的生成器函数,通过使用yield关键字来挂起函数的执行...

ob混淆加密解密,新版大众点评加密解密

1目标:新版大众点评接口参数_token加密解密数据获取:所有教育培训机构联系方式获取难点:objs混淆2打开大众点评网站,点击教育全部,打开页面,切换到mobile模式,才能找到接口。打开开发者工具...

python并发编程-同步锁(python并发和并行)

需要注意的点:1.线程抢的是GIL锁,GIL锁相当于执行权限,拿到执行权限后才能拿到互斥锁Lock,其他线程也可以抢到GIL,但如果发现Lock仍然没有被释放则阻塞,即便是拿到执行权限GIL也要立刻...

10分钟学会Python基础知识(python基础讲解)

看完本文大概需要8分钟,看完后,仔细看下代码,认真回一下,函数基本知识就OK了。最好还是把代码敲一下。一、函数基础简单地说,一个函数就是一组Python语句的组合,它们可以在程序中运行一次或多次运行。...

Python最常见的170道面试题全解析答案(二)

60.请写一个Python逻辑,计算一个文件中的大写字母数量答:withopen(‘A.txt’)asfs:count=0foriinfs.read():ifi.isupper...

Python 如何通过 threading 模块实现多线程。

先熟悉下相关概念多线程是并发编程的一种方式,多线程在CPU密集型任务中无法充分利用多核性能,但在I/O操作(如文件读写、网络请求)等待期间,线程会释放GIL,此时其他线程可以运行。GIL是P...

Python的设计模式单例模式(python 单例)

单例模式,简单的说就是确保只有一个实例,我们知道,通常情况下类其实可以有很多实例,我们这么来保证唯一呢,全局访问。如配置管理、数据库连接池、日志处理器等。classSingleton: ...

更安全的加密工具:bcrypt(bcrypt加密在线)

作为程序员在开发工作中经常会使用加密算法,比如,密码、敏感数据等。初学者经常使用md5等方式对数据进行加密,但是作为严谨开发的程序员,需要掌握一些相对安全的加密方式,今天给大家介绍下我我在工作中使用到...

一篇文章搞懂Python协程(python协程用法)

前引之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。按道理来说我们已经算是把cpu的利用率提高很多了。但是我们知道无论是创建多进程还是创建多线...

Python开发必会的5个线程安全技巧

点赞、收藏、加关注,下次找我不迷路一、啥是线程安全?假设你开了一家包子铺,店里有个公共的蒸笼,里面放着刚蒸好的包子。现在有三个顾客同时来拿包子,要是每个人都随便伸手去拿,会不会出现混乱?比如第一个顾...

取消回复欢迎 发表评论: