您现在的位置是:首页 > 创新技术
Linux 下Python 脚本编写的"奇技淫巧"
智慧创新站
2025-05-13【创新技术】233人已围观
简介写在前面对于自动化运维来讲Python是一个利器常用的自动化运维工具Ansible就是通过python编写博文为《PythonCookbook》读书笔记整理而来涉及的内容都是编写python运维脚本常用的一些知识点及Demo理解不足小伙伴帮忙指正「生命完美的答案,无非走过没有遗憾---《天蓝》」脚本...
对于自动化运维来讲Python是一个利器
常用的自动化运维工具Ansible就是通过python编写
博文为《PythonCookbook》读书笔记整理而来
涉及的内容都是编写python运维脚本常用的一些知识点及Demo
理解不足小伙伴帮忙指正
「生命完美的答案,无非走过没有遗憾---《天蓝》」
脚本编程与系统管理解析命令行选项「如何能够解析脚本运行命令行选项(位于中)」
argparse模块可被用来解析命令行选项
常用来定义一个脚本的说明文档,一般我们写python脚本会通过if..else的方式来提供一个脚本说明文档,python不支持switch。所以很麻烦,其实,我们可以通过argparse来编写说明文档。
我们来看看怎么执行一个python脚本
对于熟悉Linux的小伙伴下面的文档在熟悉不过了,这个一个标准Linxu软件包的说明文档,文档中定义是软件包的说明
┌──[root@]-[~/python_demo]└─$./:[-h]-ppattern[-v][-oOUTFILE][--speed{slow,fast}][filename[filename]]Searchsomefilespositionalarguments:filenameoptionalarguments:-h,--helpshowthishelpmessageandexit-ppattern,--patpatterntextpatterntosearchfor-vverbosemode-oOUTFILEoutputfile--speed{slow,fast}searchspeed┌──[root@]-[~/python_demo]└─$来看看这个脚本是如何编写的
脚本的描述parser=(description='Searchsomefiles')脚本接收_argument('-p','--pat',metavar='pattern',required=True,dest='patterns',action='app',help='textpatterntosearchfor')_argument('-v',dest='verbose',action='store_true',help='verbosemode')_argument('-o',dest='outfile',action='store',help='outputfile')_argument('--speed',dest='speed',action='store',choices={'slow','fast'},default='slow',help='searchspeed')args=_args()!/usr/bin/envpython3rootYay!通过重定向/管道/文件接受输入在bash中编写pytohn脚本接收外部数据的方式,一般情况下,对于一般变量,我们用命令行变量的方式比较多(手动的处理),对于文件内容或者bash命令输出直接通过脚本内部获取需要的数据。
其实python脚本也可以用其他方式来接收传递给他的文件数据或者bash命令输出,包括将命令行的输出通过管道传递给该脚本、重定向文件到该脚本,或在命令行中传递一个文件名或文件名列表给该脚本。
这里通过Python内置的fileinput模块,可以实现重定向,管道,以文佳输出的方式传递数据到脚本内部
-*-encoding:utf-8-*-"""@File:@Time:2022/05/0106:05:43@Author:LiRuilong@Version:1.0@Contact:1224965096@@Desc:None"""!/usr/bin/envpython3Outputgeneratedbeforeerrorcode=!/usr/bin/envpython3Sometexttostext=b'''helloworldthisisatestgoodbye'''Sthedataandgettheoutputstdout,stderr=(text)!/usr/bin/('Itfailed!\n')raiseSystemExit(3)┌──[root@]-[~/python_demo]└─$┌──[root@]-[~/python_demo]└─$./!┌──[root@]-[~/python_demo]└─$echo$?3
直接将消息作为参数传给SystemExit(),那么你可以省略其他步骤
!/usr/bin/envpython3!/usr/bin/envpython3Copysrctodst.(cpsrcdst)(src,dst)Copydirectorytree(cp-Rsrcdst)(src,dst)srcissourcenamemsgiserrormessagefromexceptionprint(dst,src,msg)创建和解压归档文件
「创建或解压常见格式的归档文件(比如.tar,.tgz或.zip)」
shutil模块拥有两个函数——makearchive()和unpackarchive()可派上用场,
_archive('')_archive('py33','zip','')'/Users/beazley/Downloads/'makearchive()的第二个参数是期望的输出格式。可以使用getarchiveformats()获取所有支持的归档格式列表。
_archive_formats()[('bztar',"bzip2'edtar-file"),('gztar',"gzip'edtar-file"),('tar','uncompressedtarfile'),('xztar',"xz'edtar-file"),('zip','ZIPfile')]通过文件名查找文件「你需要写一个涉及到文件查找操作的脚本,比如对日志归档文件的重命名工具,你不想在Python脚本中调用shell,或者你要实现一些shell不能做的功能。」
查找文件,可使用()函数,传一个顶级目录名给它
!/usr/bin/envpython3importosimporttimeimportsysdefmodified_within(top,seconds):now=()forpath,dirs,(top):fornameinfiles:fullpath=(path,name)(fullpath):mtime=(fullpath)ifmtime(now-seconds):print(fullpath)if__name__=='__main__':iflen()!=3:print('Usage:{}dirseconds'.format([0]))raiseSystemExit(1)modified_within([1],float([2]))打印10分钟之前被修改的数据
┌──[root@]-[~/python_demo]└─$.//etc/10/etc/mtab┌──[root@]-[~/python_demo]└─$ll/etc/月182018/etc/mtab-/proc/self/mounts┌──[root@]-[~/python_demo]└─$ll/proc/self/mounts-r--r--r--1rootroot05月201:18/proc/self/mounts┌──[root@]-[~/python_demo]└─$读取配置文件
「怎样读取普通.ini格式的配置文件?」
configparser模块能被用来读取配置文件
编写配置文件
;;Sampleconfigurationfile[installation]library=%(prefix)s/libinclude=%(prefix)s/includebin=%(prefix)s/binprefix=/usr/local`!/usr/bin/(filename='',level=)Exampleloggingcalls(insertintoyourprogram)('Host%sunknown',hostname)("Couldn'tfind%r",item)('Featureisdeprecated')('Openingfile%r,mode=%r',filename,mode)('Gothere')if__name__=='__main__':main()五个日志调用(critical(),error(),warning(),info(),debug())以降序方式表示不同的严重级别。basicConfig()的level参数是一个过滤器。所有级别低于此级别的日志消息都会被忽略掉。每个logging操作的参数是一个消息字符串,后面再跟一个或多个参数。构造最终的日志消息的时候我们使用了%操作符来格式化消息字符串。
┌──[root@]-[~/python_demo]└─$./┌──[root@]-[~/python_demo]└─$:root::root:Couldn'tfind'spam'┌──[root@]-[~/python_demo]└─$
如果你想使用配置文件,可以像下面这样修改basicConfig()调用:
():!/usr/bin/envpython3Examplefunction(fortesting)deffunc():('ACriticalError!')('Adebugmessage')func()使用这个配置,默认情况下不会打印日志,只有配置过日志系统,那么日志消息打印就开始生效
()
┌──[root@]-[~/python_demo]└─$./:__main__:ACriticalError!
通常来讲,不应该在函数库代码中自己配置日志系统,或者是已经有个已经存在的日志配置了。调用getLogger(name)创建一个和调用模块同名的logger模块。由于模块都是唯一的,因此创建的logger也将是唯一的。所以当前进程中只有一个logging会生效。
(())操作将一个空处理器绑定到刚刚已经创建好的logger对象上。一个空处理器默认会忽略调用所有的日志消息。因此,如果使用该函数库的时候还没有配置日志,那么将不会有消息或警告出现。
在这里,根日志被配置成仅仅输出ERROR或更高级别的消息。不过,somelib的日志级别被单独配置成可以输出debug级别的消息,它的优先级比全局配置高。像这样更改单独模块的日志配置对于调试来讲是很方便的,因为你无需去更改任何的全局日志配置——只需要修改你想要更多输出的模块的日志等级。(这个还有待研究)
实现一个计时器「你想记录程序执行多个任务所花费的时间」
time模块包含很多函数来执行跟时间有关的函数。尽管如此,通常我们会在此基础之上构造一个更高级的接口来模拟一个计时器。
-*-encoding:utf-8-*-importtimeclassTimer:def__init__(self,func=_counter):=0.0self._func=funcself._start=Nonedefstart(self):ifself._startisnotNone:raiseRuntimeError('Alreadystarted')self._start=self._func()defstop(self):ifself._startisNone:raiseRuntimeError('Notstarted')=self._func()+=-self._startself._start=Nonedefreset(self):=0.0@property!/usr/bin/envpython3类的属性私有化,那么可以使用@property使属性可以被外部访问并修改defrunning(self):returnself._startisnotNonedef__enter__(self):()returnselfdef__exit__(self,*args):()defcountdown(n):whilen0:n-=1Use2:Asacontextmanagerwitht:countdown(1000000)print()withTimer()ast2:countdown(1000000)print()这里通过__enter__,__exit__,使用with语句以及上下文管理器协议可以省略计时器打开和关闭操作。(关于上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明__enter__和__exit__方法,,__enter__在出现with语句被调用,__exit__在代码执行完毕被调用,可以参考open()方法)
┌──[root@]-[~/python_demo]└─$./
在计时中要考虑一个底层的时间函数问题。一般来说,使用()或()计算的时间精度因操作系统的不同会有所不同。而使用_counter()函数可以确保使用系统上面最精确的计时器。
限制脚本的内存和CPU的使用量「你想对在Unix系统上面运行的程序设置内存或CPU的使用限制。」
cpu限制resource模块能同时执行这两个任务。例如,要限制CPU时间,下面的代码在windows平台执行不了,但是Linux是可以的。
-*-encoding:utf-8-*-importsignalimportresourceimportosdeftime_exceeded(signo,frame):print("Time'sup!")raiseSystemExit(1)defset_max_runtime(seconds):限制CUP使用时间为15秒(_CPU,(seconds,hard))!/usr/bin/*1024^6=576460752303423488设置最大内存500Mlimit_memory(576460752303423488)程序运行到没有多余内存时会抛出MemoryError异常。
setrlimit()函数被用来设置特定资源上面的软限制和硬限制。
软限制是一个值,当超过这个值的时候操作系统通常会发送一个信号来限制或通知该进程.
_AS9
硬限制是用来指定软限制能设定的最大值。通常来讲,这个由系统管理员通过设置系统级参数来决定。尽管硬限制可以改小一点,但是最好不要使用用户进程去修改。
(_AS)(-1,-1)
setrlimit()函数还能被用来设置子进程数量、打开文件数以及类似系统资源的限制(cgroup)。
启动一个WEB浏览器「通过脚本启动浏览器并打开指定的URL网页」
webbrowser模块能被用来启动一个浏览器,并且与平台无关
WindowsPowerShell版权所有(C)MicrosoftCorporation。保留所有权利。尝试新的跨平台PowerShell:\(tags/:9cf6752,Oct52020,15:23:07)[(Intel)]onwin32Type"help","copyright","credits"or"license"('')True新窗口打卡网站
_new('')当前窗口打开一个tab页
_new_tab('')指定浏览器类型,可以使用()函数
c=('firefox')('')_new_tab('')True
很赞哦!(89)