当前位置:   article > 正文

python调用Linux脚本或者shell指令的几种方法_py运行linux .sh

py运行linux .sh

python调用shell脚本

# coding=utf-8   //设置文本格式
import os            //导入os方法
print('hello')
n=os.system('/home/csliyb/kjqy_xcy/bdse-tour-dp-2.1/bin/test.sh') //调用shell脚本
print '执行完毕'

 

python如何调用脚本或者shell指令?

方法1:

os.system()

只得到命令成功与否的执行状态

  1. >>> import os
  2. >>> os.system('free -m')
  3. total used free shared buffers cached
  4. Mem: 474 463 11 0 13 29
  5. -/+ buffers/cache: 420 54
  6. Swap: 1023 415 608
  7. >>> ret=os.system('free -m')
  8. total used free shared buffers cached
  9. Mem: 474 464 10 0 12 30
  10. -/+ buffers/cache: 420 53
  11. Swap: 1023 415 608
  12. >>> print ret #返回状态码是0,表示shell执行成功
  13. 0

 

方法2:

os.popen

通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。但是无法读取程序执行的返回值)

  1. >>> import os
  2. >>> output = os.popen('free -mt')
  3. >>> print output.read()
  4. total used free shared buff/cache available
  5. Mem: 7823 3445 215 64 4162 3864
  6. Swap: 3071 270 2801
  7. Total: 10895 3716 3016

 

方法3:

commands.getstatusoutput() && commands.getoutput() 

commands.getstatusoutput() 既可以输出执行成功与否的状态,也会输出执行结果

commands.getoutput() 只输出执行结果

  1. >>> import commands
  2. >>> (status, output) = commands.getstatusoutput('free -mt')
  3. >>> print status
  4. 0
  5. >>> print output
  6. total used free shared buff/cache available
  7. Mem: 7823 3475 188 64 4159 3834
  8. Swap: 3071 270 2801
  9. Total: 10895 3746 2989
  10. >>> output = commands.getoutput('free -mt')
  11. >>> print output
  12. total used free shared buff/cache available
  13. Mem: 7823 3475 188 64 4159 3834
  14. Swap: 3071 270 2801
  15. Total: 10895 3746 2989

当命令调用错误时:

  1. >>> (status, output) = commands.getstatusoutput('free -aaa')
  2. >>> print status
  3. 256
  4. >>> print output
  5. free: invalid option -- 'a'
  6. Usage:
  7. free [options]
  8. Options:
  9. -b, --bytes show output in bytes
  10. -k, --kilo show output in kilobytes
  11. -m, --mega show output in megabytes
  12. -g, --giga show output in gigabytes
  13. --tera show output in terabytes
  14. -h, --human show human-readable output
  15. --si use powers of 1000 not 1024
  16. -l, --lohi show detailed low and high memory statistics
  17. -t, --total show total for RAM + swap
  18. -s N, --seconds N repeat printing every N seconds
  19. -c N, --count N repeat printing N times, then exit
  20. -w, --wide wide output
  21. --help display this help and exit
  22. -V, --version output version information and exit
  23. For more details see free(1).

方法4:

subprocess子进程(功能强大,最常使用的方式)

subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。

 

(1)subprocess.call执行命令,并返回状态,类似os.system(),shell=True可以直接调用命令,而shell=False命令和参数需要分开

  1. >>> output = subprocess.call(['free','-mt'],shell=False)
  2. total used free shared buff/cache available
  3. Mem: 7823 3446 209 64 4167 3863
  4. Swap: 3071 270 2801
  5. Total: 10895 3716 3011
  6. >>> print output
  7. 0
  8. >>> output = subprocess.call('free -mt',shell=True)
  9. total used free shared buff/cache available
  10. Mem: 7823 3445 209 64 4167 3863
  11. Swap: 3071 270 2801
  12. Total: 10895 3716 3010
  13. >>> print output
  14. 0

(2)subprocess.check_call 用法与subprocess.call()类似,区别是,当返回值不为0时,还会抛出python层面的异常

  1. >>> output = subprocess.call('la -ltrh',shell=True)
  2. /bin/sh: la: command not found
  3. >>> output = subprocess.check_call('la -ltrh',shell=True)
  4. /bin/sh: la: command not found
  5. Traceback (most recent call last):
  6. File "<stdin>", line 1, in <module>
  7. File "/usr/lib64/python2.7/subprocess.py", line 542, in check_call
  8. raise CalledProcessError(retcode, cmd)
  9. subprocess.CalledProcessError: Command 'la -ltrh' returned non-zero exit status 127

 

(3)suprocess.Popen()

在一些复杂场景中,我们需要将一个进程的执行输出作为另一个进程的输入。在另一些场景中,我们需要先进入到某个输入环境,然后再执行一系列的指令等。这个时候我们就需要使用到suprocess.Popen()方法。该方法有以下参数:

args:shell命令,可以是字符串,或者序列类型,如list,tuple。

stdin,stdout,stderr:分别表示程序的标准输入,标准输出及标准错误

shell:True或False

cwd:用于设置子进程的当前目录

env:用于指定子进程的环境变量。如果env=None,则默认从父进程继承环境变量

universal_newlines:不同系统的的换行符不同,当该参数设定为true时,则表示使用\n作为换行符

 

如:在/usr/local/mysql下创建一个suprocesstest的目录:

  1. >>> output = subprocess.Popen('mkdir subprocesstest',shell=True,cwd='/usr/local/mysql')
  2. >>> output = subprocess.Popen('ls -ld sub*',shell=True,cwd='/usr/local/mysql')
  3. drwxr-xr-x 2 mysqladmin dba 6 Mar 5 16:12 subprocesstest

使用标准输出stdout和标准错误stderr,不会把输出结果返回到显示屏上

  1. >>> child1 = subprocess.Popen('free -mt',shell=True)
  2. >>> total used free shared buff/cache available
  3. Mem: 7823 3446 204 64 4172 3863
  4. Swap: 3071 270 2801
  5. Total: 10895 3716 3006
  6. >>> child1 = subprocess.Popen('free -mt',shell=True,stdout=subprocess.PIPE)
  7. >>> output = child1.communicate()
  8. >>> print output
  9. (' total used free shared buff/cache available\nMem: 7823 3446 201 64 4175 3862\nSwap: 3071 270 2801\nTotal: 10895 3717 3002\n', None)
  10. >>> child1 = subprocess.Popen('lss',shell=True,stdout=subprocess.PIPE)
  11. /bin/sh: lss: command not found
  12. >>> child1 = subprocess.Popen('lss',shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
  13. >>> output = child1.communicate()
  14. >>> print output
  15. ('', '/bin/sh: lss: command not found\n')

将一个子进程的输出,作为另一个子进程的输入,相当于管道,如:cat /etc/passwd|grep 'root'

  1. >>> import subprocess
  2. >>> child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
  3. >>> child2 = subprocess.Popen(["grep","root"],stdin=child1.stdout, stdout=subprocess.PIPE)
  4. >>> output = child2.communicate()
  5. >>> print output
  6. ('root:x:0:0:root:/root:/bin/bash\noperator:x:11:0:operator:/root:/sbin/nologin\n', None)

封装一个函数:功能是调用系统命令:

  1. import subprocess
  2. def f1(cmd):
  3. a = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
  4. output = a.stdout.read()
  5. code = a.wait()
  6. return code, output
  7. print f1('ls')
  8. print f1('lll')
  9. 输出结果:
  10. >>> print f1('ls')
  11. (0, 'tb.txt\ntest2.py\ntest.py\n')
  12. >>> print f1('lll')
  13. (127, '/bin/sh: lll: command not found\n')
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/72286
推荐阅读
相关标签
  

闽ICP备14008679号