美文网首页大数据 爬虫Python AI SqlPython小哥哥
利用Python3实现Linux的脚本功能 !

利用Python3实现Linux的脚本功能 !

作者: 14e61d025165 | 来源:发表于2019-04-20 14:56 被阅读1次

    Python 3的更新已经有一段时间了,相比较于Python2也有许多不同的改变,Python 3 在Linux中也是利用比较多的,这里主要实践了一些Python3利用Linux的脚本执行命令。

    !/usr/bin/env python3

    print ('hello,world')
    import os
    val2 = os.system('cd trb && cd trb')
    val3 = os.system('ls')
    print('val2 is ',val2)
    源代码加群!欢迎加入新手技术交流基地:*1004391443 群里有大牛解答,有资源,有源码,学不学的会就看你了!

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

    两行调用没有继承性,如果要连续执行就在一个语句里加 && (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读取也可以用来遍历。

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

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

    有以下命令:

    subprocess.getstatusoutput(cmd )

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

    3.4之后添加win支持

    subprocess.getoutput(cmd )

    执行cmd然后返回结果

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

    上面为代码

    输出:

    subprocess.getstatusoutput 输出 (0, '总用量 48\n-rwxr--r-- 1 para036 bjpara 516 4月 16 2018 Abcd.py\n-rwxr--r-- 1 para036 bjpara 1619 4月 16 16:58 automesh_onpsn_fortest.sh\n-rwxr--r-- 1 para036 bjpara 1616 4月 15 14:31 automesh.sh\ndrwxr-xr-x 5 para036 bjpara 4096 4月 15 14:31 Cal_Ori\n-rw-r --r-- 1 para036 bjpara 32 4月 16 16:56 fold.txt\n-rwxr--r-- 1 para036 bjpara 1530 4月 15 14:45 Linux_py_temp.py\n-rw-r--r-- 1 para036 bjpara 27 4月 15 14:43 meshedjob.rec\ndrwxr-xr-x 2 para036 bjpara 4096 4月 15 14:31 new_geom\ndrwxr-xr-x 5 para036 bjpara 4096 4月 15 14:51 onc143314\ndrwx r-xr-x 5 para036 bjpara 4096 4月 16 17:05 onc16165650\ndrwxr-xr-x 5 para036 bjpara 4096 4月 16 16:46 onc163840\ndrwxr-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\n',recomd)print(recomd.returncode)
    如果要返回输出,要添加参数,传递subprocess.PIPE给stdout和stderr,然后可以通过返回的CompletedProcess类实例的stdout和stderr属性或捕获相应的内容;

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

    总代码如下:

    !/usr/bin/env python3print ('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 subprocessrecomd = subprocess.run(['ls','-l']#等待命令执行完成后会在屏幕输出执行结果,然后返回一个包含执行结果的CompletedProcess类的实例。print('输出recmd\n',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('\n') ))print(recomdouterr.stdout.strip().split('\n')[-1])# legacycmd = subprocess.getstatusoutput('ls -l')## print('subprocess.getstatusoutput 输出',legacycmd)## legacycmd2 = subprocess.getoutput('ls -l')## print('subprocess.getoutput 输出',legacycmd2)

    相关文章

      网友评论

        本文标题:利用Python3实现Linux的脚本功能 !

        本文链接:https://www.haomeiwen.com/subject/lkflgqtx.html