范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

Python技法实用运维脚本编写(进程文件目录操作)

  Python在很大程度上可以对shell脚本进行替代。笔者一般单行命令用shell,复杂点的多行操作就直接用Python了。这篇文章就归纳一下Python的一些实用脚本操作。 1. 执行外部程序或命令
  我们有以下C语言程序cal.c(已编译为.out文件),该程序负责输入两个命令行参数并打印它们的和。该程序需要用Python去调用C语言程序并检查程序是否正常返回(正常返回会返回 0)。 #include #include int main(int argc, char* argv[]){     int a = atoi(argv[1]);     int b = atoi(argv[2]);     int c = a + b;     printf("%d + %d = %d ", a, b, c);     return 0; }
  那么我们可以使用subprocess模块的run函数来spawn一个子进程: res = subprocess.run(["Python-Lang/cal.out", "1", "2"]) print(res.returncode)
  可以看到控制台打印出进程的返回值0: 1 + 2 = 3 0
  当然,如果程序中途被杀死。如我们将下列while.c程序写为下列死循环(已编译为.out文件): #include #include int main(int argc, char* argv[]){     while(1);     return 0; }
  我们同样用run函数接收其返回值: res = subprocess.run("Python-Lang/while.out") print(res.returncode)
  不过我们在程序运行中用shell命令将其终止掉: (base) orion-orion@MacBook-Pro Python-Lang % ps -a |grep while  11829 ttys001    0:17.49 Python-Lang/while.out 11891 ttys005    0:00.00 grep while (base) orion-orion@MacBook-Pro Python-Lang % kill 11829
  可以看到控制台打印输出的进程返回值为-15(因为负值-N表示子进程被信号N终止,而kill命令默认的信号是15,该信号会终止进程): -15
  如果程序陷入死循环不能正常终止,我们总不能一直等着吧?此时,我们可以设置超时机制并进行异常捕捉: try:     res = subprocess.run(["Python-Lang/while.out"], capture_output=True, timeout=5) except subprocess.TimeoutExpired as e:     print(e)
  此时会打印输出异常结果: Command "["Python-Lang/while.out"]" timed out after 5 seconds
  有时需要获取程序的输出结果,此时可以加上capture_output参数,然后访问返回对象的stdout属性即可: res = subprocess.run(["netstat", "-a"], capture_output=True) out_bytes = res.stdout
  输出结果是以字节串返回的,如果想以文本形式解读,可以再增加一个解码步骤: out_text = out_bytes.decode("utf-8") print(out_text)
  可以看到已正常获取文本形式的输出结果: ... kctl       0      0     33      6 com.apple.netsrc kctl       0      0     34      6 com.apple.netsrc kctl       0      0      1      7 com.apple.network.statistics kctl       0      0      2      7 com.apple.network.statistics kctl       0      0      3      7 com.apple.network.statistics  (base) orion-orion@MacBook-Pro Learn-Python %
  一般来说,命令的执行不需要依赖底层shell的支持(如sh,bash等),我们提供的字符串列表会直接传递给底层的系统调用,如os.execve()。如果希望命令通过shell来执行,只需要给定参数shell=True并将命令以简单的字符串形式提供即可。比如我们想让Python执行一个涉及管道、I/O重定向或其它复杂的Shell命令时,我们就可以这样写: out_bytes = subprocess.run("ps -a|wc -l> out", shell=True) 2. 文件和目录操作(命名、删除、拷贝、移动等)
  我们想要和文件名称和路径打交道时,为了保证获得最佳的移植性(尤其是需要同时运行与Unix和Windows上时),最好使用os.path中的函数。例如: import os file_name = "/Users/orion-orion/Documents/LocalCode/Learn-Python/Python-Lang/test.txt" print(os.path.basename(file_name))  # test.txt print(os.path.dirname(file_name)) # /Users/orion-orion/Documents/LocalCode/Learn-Python/Python-Lang print(os.path.split(file_name)) # ("/Users/orion-orion/Documents/LocalCode/Learn-Python/Python-Lang", "test.txt") print(os.path.join("/new/dir", os.path.basename(file_name))) # /new/dir/test.txt print(os.path.expanduser("~/Documents")) # /Users/orion-orion/Documents
  其中os.path.expanduser当用户或$HOME未知时, 将不做任何操作。如我们这里的$HOME就为/Users/orion-orion: (base) orion-orion@MacBook-Pro ~ % echo $HOME /Users/orion-orion
  如果要删除文件,请用os.remove(在删除前注意先判断文件是否存在): file_name = "Python-Lang/test.txt" if os.path.exists(file_name):     os.remove(file_name)
  接下来我们看如何拷贝文件。当然最直接的方法是调用Shell命令: os.system("cp Python-Lang/test.txt Python-Lang/test2.txt")
  当然这不够优雅。如果不像通过调用shell命令来实现,可以使用shutil模块,该模块提供了一系列对文件和文件集合的高阶操作,其中就包括文件拷贝和移动/重命名。这些函数的参数都是字符串,用来提供文件或目录的名称。以下是示例:  src = "Python-Lang/test.txt" dst = "Python-Lang/test2.txt"  # 对应cp src dst (拷贝文件,存在则覆盖) shutil.copy(src, dst)    src = "Python-Lang/sub_dir" dst = "Python-Lang/sub_dir2" # 对应cp -R src dst (拷贝整个目录树) shutil.copytree(src, dst)  src = "Python-Lang/test.txt" dst = "Python-Lang/sub_dir/test2.txt" # 对应mv src dst (移动文件,可选择是否重命名) shutil.move(src, dst)
  可以看到,正如注释所言,这些函数的语义和Unix命令类似。
  默认情况下,如果源文件是一个符号链接,那么目标文件将会是该链接所指向的文件的拷贝。如果只想拷贝符号链接本身,可以提供关键字参数follow_symlinks: shutil.copy(src, dst, follow_symlinks=True)
  如果想在拷贝的目录中保留符号链接,可以这么做: shutil.copytree(src, dst, symlinks=True)
  有时在拷贝整个目录时需要对特定的文件和目录进行忽略,如.pyc这种中间过程字节码。我们可以为copytree提供一个ignore函数,该函数已目录名和文件名做为输入参数,返回一列要忽略的名称做为结果(此处用到字符串对象的.endswith方法,该方法用于获取文件类型): def ignore_pyc_files(dirname, filenames):     return [name for name in filenames if name.endswith("pyc")]    shutil.copytree(src, dst, ignore=ignore_pyc_files)
  不过由于忽略文件名这种模式非常常见,已经有一个实用函数ignore_patterns()提供给我们使用了(相关模式使用方法类似.gitignore): shutil.copytree(src, dst, ignore=shutil.ignore_patterns("*~", "*.pyc"))
  注:此处的"*~"模式匹配是文本编辑器(如Vi)产生的以"~"结尾的中间文件。
  忽略文件名还常常用在os.listdir()中。比如我们在数据密集型(如机器学习)应用中,需要遍历data目录下的所有数据集文件并加载,但是需要排除.开头的隐藏文件,如.git,否则会出错,此时可采用下列写法: import osimport osfilenames = [filename for filename in os.listdir("Python-Lang/data") if not filename.startswith(".")] #注意,os.listdir返回的是不带路径的文件名
  让我们回到copytree()。用copytree()来拷贝目录时,一个比较棘手的问题是错误处理。比如在拷贝的过程中遇到已经损坏的符号链接,或者由于权限问题导致有些文件无法访问等。对于这种情况,所有遇到的异常会收集到一个列表中并将其归组为一个单独的异常,在操作结束时抛出。示例如下: import shutil  src = "Python-Lang/sub_dir" dst = "Python-Lang/sub_dir2"  try:     shutil.copytree(src, dst) except shutil.Error as e:     for src, dst, msg in e.args[0]:         print(src, dst, msg)
  如果提供了ignore_dangling_symlinks=True,那么copytree将会忽略悬垂的符号链接。
  更多关于shutil的使用(如记录日志、文件权限等)可参见shutil文档[4]。
  接下来我们看如何使用os.walk()函数遍历层级目录以搜索文件。只需要将顶层目录提供给它即可。比如下列函数用来查找一个特定的文件名,并将所有匹配结果的绝对路径打印出来: import os def findfile(start, name):     for relpath, dirs, files in os.walk(start):         if name in files:             # print(relpath)             full_path = os.path.abspath(os.path.join(relpath, name))             print(full_path)  start = "." name = "test.txt" findfile(start, name)
  可以看到,os.walk可为为我们遍历目录层级,且对于进入的每个目录层级它都返回一个三元组,包含:正在检视的目录的相对路径(相对脚本执行路径),正在检视的目录中包含的所有目录名列表,正在捡视的目录中包含的所有文件名列表。这里的os.path.abspath接受一个可能是相对的路径并将其组成绝对路径的形式。
  我们还能够附加地让脚本完成更复杂的功能,如下面这个函数可打印出所有最近有修改过的文件: import os import time def modified_within(start, seconds):     now = time.time()     for relpath, dirs, files in os.walk(start):         for name in files:             full_path = os.path.join(relpath, name)             mtime = os.path.getmtime(full_path)             if mtime > (now - seconds):                 print(full_path)  start = "." seconds = 60 modified_within(start, 60) 3. 创建和解包归档文件
  如果仅仅是想创建或解包归档文件,可以直接使用shutil模块中的高层函数: import shutil shutil.make_archive(base_name="data", format="zip", root_dir="Python-Lang/data") shutil.unpack_archive("data.zip")
  其中第二个参数format为期望输出的格式。要获取所支持的归档格式列表,可以使用get_archive_formats()函数: print(shutil.get_archive_formats()) # [("bztar", "bzip2"ed tar-file"), ("gztar", "gzip"ed tar-file"), ("tar", "uncompressed tar file"), ("xztar", "xz"ed tar-file"), ("zip", "ZIP file")]
  Python也提供了诸如tarfile、zipfile、gzip等模块来处理归档格式的底层细节。比如我们想要创建然后解包.zip归档文件,可以这样写: import zipfile   with zipfile.ZipFile("Python-Lang/data.zip", "w") as zout:     zout.write(filename="Python-Lang/data/test1.txt", arcname="test1.txt")     zout.write(filename="Python-Lang/data/test2.txt", arcname="test2.txt") with zipfile.ZipFile("Python-Lang/data.zip", "r") as zin:     zin.extractall("Python-Lang/data2") #没有则自动创建data2目录
  说明:本文限于篇幅,故而只展示部分的内容,需要的朋友可以找我要
  如果本文对你有帮助,别忘记给我个3连 ,点赞,转发,评论,
  咱们下期见。

cpu的使用寿命有多长?答永远。简单说。能用到这款CPU淘汰为止,到寿命。目前世界上还有很多第一代民用级CPU还在工作。比如80286。已经使用差不多40年了,在使用40年问题不大。但是这个宇宙没有什么是程序员用来做笔记的软件有哪些推荐?推荐三个好用的笔记软件给大家。1有道云笔记有道云笔记Markdown语法。优点是手机电脑可同步使用,而且关键免费。2visualstudiocode一款功能强大的记录软件,可装插件联想正式官宣,加入华为欧拉系统,能洗白吗?华为需警惕欧拉操作系统已经被国家采用为操作系统了,如果联想公司不加入,你说联想电脑以后还能获得中国政府采购吗?这不是联想公司有多爱国,而是不加入欧拉操作系统,就没有中国政府采购这块满帧运行90帧王者,vivoS12Pro核心配置出众带来新惊喜在vivo旗下的手机中,S系列产品有着时尚潮流的外观和出众的影像表现,每一代产品都赢得了很多消费者的青睐。近期,最新的vivoS12系列依然继承了上述的两大优势,并在核心配置上全面柳传志到底是企业教父还是厚黑教主?自从司马大将军质疑联想以来,广大网友一直疑惑柳传志到底是企业教父还是厚黑教主?为什么柳传志在被质疑之前,他一直给人们留下的印象那么好形象那么高大?以至于被人广为传颂成中国的企业教父美国会传唤谷歌等社交媒体巨头调查国会骚乱事件来源新浪科技北京时间1月14日早间消息,负责调查2021年1月6日美国国会大厦骚乱的众议院特别委员会主席周四表示,该委员会已对社交媒体巨头TwitterRedditFacebook设计模式之设计原则SOLID原则是由五个设计原则组成单一职责原则(SRP),开闭原则(OCP),里式替换原则(LSP),接口隔离原则(ISP),依赖反转原则(DIP)单一职责原则(SRP)概念单一职中汽中心发布智能辅助驾驶测评数据蔚来EC6智能驾驶远远落后来源中国消费者报L2级别自动驾驶技术可以缓解交通拥堵,可以减轻驾驶者负担,还可以丰富人们用车生活自动驾驶已成为当下汽车市场热门话题,同时也成为消费者选购车辆的重要指标。然而,纷至沓发展工业互联网需要持久战作者曹曼丨来源Dr曹曼,本文经授权转载一背景现状大家知道,工业互联网的概念由GE公司于2012年提出,很快得到美国政府的认可,并成为国家的发展战略。随后多国也做出了响应,尤其是发达腾讯免费开放无障碍输入技术,搜狗输入法发布眼动方案北京商报讯(记者魏蔚)1月13日,由中国残疾人联合会直属中国残疾人辅助器具中心指导,腾讯旗下搜狗输入法信息无障碍研究会全国残疾人用品开发供应总站共同发起众声无障碍输入公益计划。该计跨境早知道2025年新加坡电商规模超百亿美元今日头条01商务部跨境电商5年增长近10倍2021年保持两位数增长商务部新闻发言人束珏婷1月13日在新闻发布会上表示,近年来,我国外贸新业态蓬勃发展,持续创新。据悉,下一步,商务部
中国移动5G招标华为一无所获,高通成为最大赢家科研技术的推陈出新,产品设备的更新迭代,加速推动了5G全民时代的到来。纵观全球市场,在5G领域掌握话语权的大部分为海外企业,包括高通诺基亚爱立信等通讯巨头,不过在技术壁垒的封锁下,华为的阵痛一场由鸿蒙主导的转型能成吗?文熔财经作者XL被动后退的消费者业务华为的处境有点尴尬。年初至今发布的新机本就寥寥无几,延续至今已有10年的P系列往年都是34月份举行上市发布,P50今年却拖到了7月29日,且无法2599元,中国移动华为智选NZONES7Pro发布并开启预售IT之家8月15日消息今年6月,中国移动旗下的NZONE品牌发布了NZONES7系列5G手机,售价22992499元,类似华为畅享,而联通推出了优畅享2020Plus,电信则推出了新能源汽车销量大增,市场迅速崛起,中国能够领跑世界吗?虽然我国的乘用汽车产销量逐年下降,但是新能源汽车的产销量却出现了较大的增长,目前我国已成为世界上新能源汽车的最大市场,占据41的全球市场份额。新能源汽车是一种新兴产业,随着低碳经济为什么越来越多的果粉投向安卓怀抱iphone4的发布开启了智能机的时代,随后5。6。7的发布更是把苹果推向了巅峰,让当年的安卓手机望尘莫及。但是最近几年,国内的苹果手机销量却逐年降低,究其原因,我觉得有以下几点。比芯片卡脖子还严重,美国芯片专家多是华人,我国半导体该觉醒了点击关注,每天精彩不断!导读比芯片卡脖子还严重,美国芯片专家大多是华人,我国半导体该觉醒了随着科技的快速发展,如今我们对半导体芯片的依赖程度也开始变得越来越深,虽然说一个芯片看上去家里要换空调,看上了小米的,但这几个款式有什么区别?价钱差的不是很多,哪个值?小米家空调机型详解分析小米挂机空调都是代工的,贴牌的长虹代工TCL代工长虹代工产品米家变频M3机型制冷剂R410A三级能耗适用于1620平方左右米家变频M1机型(推荐)制冷剂R41华为不是孤军奋战!海思芯片实现量产,ASML台积电有望被取代在芯片方面,我国在上世纪六七十年代就已涉足,但因为拿来主义让西方在这一领域占领了高地,同时给我国半导体企业的发展造成了很大阻碍。早期的汉芯造假事件,同样给我们半导体行业带来了重创,秋季发布苹果13120Hz高刷对角线相机更窄边框,你要的来了笔歌科技独家报道离苹果秋季发布会越来越近了,大家对苹果新一年周期的旗舰手机也是越来越期待,小刘海对角线相机极致窄边框是你想要的吗?一起来围观!01苹果秋季发布会临近距离本年度的苹果买到翻新iPhone商家不认账怎么办?一招让你被动变主动很多人都喜欢在某平台买iPhone,这些iPhone无一例外都号称是原装机。今天有网友找到我,自己买了一台iPhone11,成色挺好,但总感觉是翻新机,又找不到问题!让我帮忙看看。即将发布的三星GalaxyZFold35G折叠手机今天小编来说说这款三星折叠屏手机,该机型尚未在中国发布,此前三星电子发布了GalaxyZFold25G机型,凭借独特的美学赢得了用户的一致好评与喜爱,就在近日它的全新升级产品三星G