博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 调用 Shell命令
阅读量:4707 次
发布时间:2019-06-10

本文共 2833 字,大约阅读时间需要 9 分钟。

python程序中调用shell命令,是件很酷且常用的事情
今天来总结一下
 
1.使用os模块 的  system
        此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的
退出状态
如果command有执行内容,会在标准输出显示。这实际上是使用C标准库函数system()实现的。
    
  system方法会创建子进程运行外部程序,方法只返回外部程序的运行状态。这个方法比较适用于外部程序没有输出结果的情况
>>> import os
>>> os.system('ls')
1.py                   51.29.txt        dead.letter  error.txt      yue.csv
1.txt                  anaconda-ks.cfg  dengji.sh    kefuTongji.sh
0
>>> a=os.system('ls')
1.py                   51.29.txt        dead.letter  error.txt      yue.csv
1.txt                  anaconda-ks.cfg  dengji.sh    kefuTongji.sh
>>> print a
0
 
 

2.os模块的popen方法

        打开一个与command进程之间的管道。
这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是’r')。如果mode为’r',可以使用此函数的返回值调用read()来获取command命令的执行结果。
       
当需要得到外部程序的输出结果时,本方法非常有用,返回一个类文件对象,调用该对象的read()或readlines()方法可以读取输出内容
>>> os.popen('ls')
<open file 'ls', mode 'r' at 0x7f365a5075d0>
 
>>> print os.popen('ls').read()
1.py
1.txt
 
>>>a=os.popen('ls').readlines()
>>>print a
['1.py\n', '1.txt\n', '2016_11_28_access_log\n', '51.29.txt\n', 'anaconda-ks.cfg\n']
 
 

3.commands模块的  getoutput 方法

      这种方法同popend的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。

主要方法:  

*   commands.getstatusoutput(cmd)         返回(status, output)

*   commands.getoutput(cmd)                   只返回输出结果
*   commands.getstatus(file)                     返回ls -ld file的执行结果字符串,调用了getoutput,不建议

 

>>> import commands

>>> commands.getstatusoutput('ls')

(0, '1.py\n1.txt\n2016_11_28_access_log\n51.29.txt\nanaconda-ks.cfg\ndata.txt\ndead.letter\ndengji.sh\ndiskJK,sh')

 

>>> commands.getoutput('ls')

'1.py\n1.txt\n2016_11_28_access_log\n51.29.txt\nanaconda-ks.cfg'

 
>>> commands.getstatus('1.py')=ippi
'-rwxr-xr-x 1 root root 69 Jan 19 14:22 1.py'
 
 

4.模块subprocess

         subprocess意在替代其他几个老的模块或者函数,
比如:os.system os.spawn*  os.popen*  popen2.* commands.*

       根据Python官方文档说明,subprocess模块用于取代上面这些模块。有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用subprocess启动子进程来干活
 
subprocess.Popen('脚本/shell', shell=True)        无阻塞、和主程序并行运行
subprocess.call('脚本/shell', shell=True)              必须等待命令执行完毕
 
>>> import subprocess
>>> subprocess.Popen("ls")
1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv
<subprocess.Popen object at 0x7fda1a0fcc50>
 
>>> a=subprocess.Popen("ls")
1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv
>>> print a
<subprocess.Popen object at 0x7fda1a0fcc90>
>>>subprocess.Popen('. xxx.sh', stdout = subprocess.PIPE, shell = True).stdout.read()
'1.py\n1.txt\n2016_11_28_access_log\n51.29.txt\n'
 
  1. p = subprocess.Popen("python stdTest.py",shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)  
  2. sout = p.stdout.readlines()  
  3. serr = p.stderr.readlines()  
  4. print sout  
  5. print serr  
 
 
 
>>> subprocess.call("ls")
1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv
 
>>> a=subprocess.call("ls")
1.py                   anaconda-ks.cfg  diskJK,sh      yue.csv
>>> print a
0
 
 
>>> from subprocess import call
>>> call(["ls","-l"])
total 2972
-rwxr-xr-x 1 root root     220 Jan 17 22:33 1.sh
 
 
 
总结一下:
1.os.system            命令行可以输出运行内容,但只能返回
运行状态
2.os.popen             返回一个类文件对象,可以从此文件读取
输出内容
3.commands.get    既能返回
输出内容,也能返回
运行结果状态
4.subprocess         
 既能返回
输出内容
,也能返回
运行结果状态

 

转载于:https://www.cnblogs.com/centos2017/p/7896745.html

你可能感兴趣的文章
Oracle 数据库字典 sys.col$ 表中关于type#的解释
查看>>
手动写的第一个eChart代码
查看>>
Vue数据绑定隐藏的神坑....
查看>>
邮件欺诈与SPF防御
查看>>
第18月第16天 statusBar
查看>>
第28月第24天 requestSerializer
查看>>
LeetCode Largest Divisible Subset
查看>>
LeetCode 407. Trapping Rain Water II
查看>>
Lua性能优化
查看>>
.Net 面试常见问题
查看>>
Equilibrium Mobile (UVa 12166) dfs二叉树
查看>>
织梦dedecms 无法下载远程图片 fsockopen函数被禁用的解决方法
查看>>
SYS和SYSTEM,DBA,SYSDBA和SYSOPER,/和username/password
查看>>
设计模式-简单工厂Coding+jdk源码解析
查看>>
文本处理命令--cut、sort、join
查看>>
专业技能就是金钱
查看>>
Comparable与Comparator的区别
查看>>
LeetCode Reverse Words in String (Java)
查看>>
String.prototype.getParm
查看>>
15.04.14-登录之后刷新AntiForgeryToken
查看>>