视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
利用python3实现Linux的脚本功能
2020-11-27 14:11:07 责编:小采
文档
Python 3的更新已经有一段时间了,相比较于Python2也有许多不同的改变,Python 3 在Linux中也是利用比较多的,这里主要实践了一些Python3利用Linux的脚本执行命令。

首先,如果只需要执行,或者只需要得到执行的状态可以用 os.system 调用

#!/usr/bin/env python3
print ('hello,world')
import os
val2 = os.system('cd trb && cd trb')
val3 = os.system('ls')
print('val2 is ',val2)

上述代码。如果val2内代码执行成功,即有两级trb文件夹,则val2 的值是0 否则是256

两行调用没有继承性,如果要连续执行就在一个语句里加 && (Shell 语法)

在print之前,屏幕还会显示执行的结果

hello,worldsh: line 0: cd: trb: 没有那个文件或目录
Abcd.py automesh.sh Cal_Ori fold.txt Linux_py_temp.py meshedjob.rec new_geom onc143314 trb
val2 is 256

os.popen(cmd)方法,只能得到运行的输出,但是如果不print屏幕上就什么也没有。

例如

val4 = os.popen('cd trb && cd trb')
val5 = os.popen('ls')print('开始PRINT')print(val4.read())print(val5.read())

显示如下

hello,world
开始PRINT/bin/sh: line 0: cd: trb: 没有那个文件或目录
Abcd.py
automesh.shCal_Ori
fold.txt
Linux_py_temp.py
meshedjob.rec
new_geom
onc143314
trb

这里输出是类文件的对象,要调用read或者readlines读取也可以用来遍历。

############

终极武器,subprocess

py3.5后建议使用的模块subprocess

网上教程里的commands 是2里的功能,在3里被删除,但是可以通过subprocess调用

有以下命令:

subprocess.getstatusoutputcmd

在shell中返回执行cmd(status, output) 返回2个元素的元组

3.4之后添加win支持

subprocess.getoutputcmd

执行cmd然后返回结果

legacycmd = subprocess.getstatusoutput('ls -l')print('subprocess.getstatusoutput 
输出',legacycmd) legacycmd2 = subprocess.getoutput('ls -l')print('subprocess.getoutput 输出',legacycmd2)

上面为代码

输出:

subprocess.getstatusoutput 
输出 (0, '总用量 48 -rwxr--r-- 1 para036 bjpara 516 4月 16 2018 Abcd.py -rwxr--r-- 1 para036 bjpara 1619 4月 16 16:58 automesh_onpsn_fortest.sh -rwxr--r-- 1 para036 bjpara 1616 4月 15 14:31 automesh.sh drwxr-xr-x 5 para036 bjpara 4096 4月 15 14:31 Cal_Ori -rw-r --r-- 1 para036 bjpara 32 4月 16 16:56 fold.txt -rwxr--r-- 1 para036 bjpara 1530 4月 15 14:45 Linux_py_temp.py -rw-r--r-- 1 para036 bjpara 27 4月 15 14:43 meshedjob.rec drwxr-xr-x 2 para036 bjpara 4096 4月 15 14:31 new_geom drwxr-xr-x 5 para036 bjpara 4096 4月 15 14:51 onc143314 drwx r-xr-x 5 para036 bjpara 4096 4月 16 17:05 onc16165650 drwxr-xr-x 5 para036 bjpara 4096 4月 16 16:46 onc163840 drwxr-xr-x 2 para036 bjpara 4096 4 月 15 14:32 trb') subprocess.getoutput 输出 总用量 48 -rwxr--r-- 1 para036 bjpara 516 4月 16 2018 Abcd.py -rwxr--r-- 1 para036 bjpara 1619 4月 16 16:58 automesh_onpsn_fortest.sh -rwxr--r-- 1 para036 bjpara 1616 4月 15 14:31 automesh.sh drwxr-xr-x 5 para036 bjpara 4096 4月 15 14:31 Cal_Ori -rw-r--r-- 1 para036 bjpara 32 4月 16 16:56 fold.txt -rwxr--r-- 1 para036 bjpara 1530 4月 15 14:45 Linux_py_temp.py -rw-r--r-- 1 para036 bjpara 27 4月 15 14:43 meshedjob.rec drwxr-xr-x 2 para036 bjpara 4096 4月 15 14:31 new_geom drwxr-xr-x 5 para036 bjpara 4096 4月 15 14:51 onc143314 drwxr-xr-x 5 para036 bjpara 4096 4月 16 17:05 onc16165650 drwxr-xr-x 5 para036 bjpara 4096 4月 16 16:46 onc163840 drwxr-xr-x 2 para036 bjpara 4096 4月 15 14:32 trb

  其中output是字符串。如果不print就不显示

新的版本推荐使用subprocess.run() 来解决一般问题。

subprocess.run()、subprocess.call()、subprocess.check_call()和subprocess.check_output()都是通过对subprocess.Popen的封装来实现的高级函数,因此如果我们需要更复杂功能时,可以通过subprocess.Popen来完成

run默认不会返回输出,只返回命令和执行状态

recomd = subprocess.run(['ls','-l'])#等待命令执行完成后会在屏幕
输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。print('输出recmd ',recomd)print(recomd.returncode)

输出如下:

如果要返回输出,要添加参数,传递subprocess.PIPE给stdout和stderr,然后可以通过返回的CompletedProcess类实例的stdout和stderr属性或捕获相应的内容;

universal_newlines: 该参数影响的是输入与输出的数据格式,比如它的值默认为False,此时stdout和stderr的输出是字节序列;当该参数的值设置为True时,stdout和stderr的输出是字符串。

总代码如下:

#!/usr/bin/env python3
print ('hello,world')
import os
# val2 = os.system('cd trb && cd trb')
# val3 = os.system('ls')
# print('val2 is ',val2)
# val4 = os.popen('cd trb && cd trb')
# val5 = os.popen('ls')
# print('开始PRINT')
# print(val4.read())
# print(val5.read())
import subprocess
recomd = subprocess.run(['ls','-l'])
#等待命令执行完成后会在屏幕
输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。 print('输出recmd ',recomd) print(recomd.returncode) print('传递参数') recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True) print('输出outerr',recomdouterr.stdout,recomdouterr.stderr) print('传递参数2') recomdouterr = subprocess.run( ['ls','-l'],stdout=subprocess.PIPE,universal_newlines=True) print('输出outerr',recomdouterr.stdout) print(len( recomdouterr.stdout.strip().split(' ') )) print(recomdouterr.stdout.strip().split(' ')[-1]) # legacycmd = subprocess.getstatusoutput('ls -l') # # print('subprocess.getstatusoutput 输出',legacycmd) # # legacycmd2 = subprocess.getoutput('ls -l') # # print('subprocess.getoutput 输出',legacycmd2)

参考资料:python3.5 官方文档 : https://docs.python.org/3.5/library/subprocess.html

Python的使用途径越来越广泛了,而Linux作为服务器端也是大有作为,使用Python来实现Linux的脚本操作,简化了服务器端的操作,提高了可控性。

下载本文
显示全文
专题