`
喜欢蓝色的我
  • 浏览: 371111 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Python下调用Linux的Shell命令

 
阅读更多

      有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的。那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法:

1. os 模块

 

1.1. os模块的exec方法族

Python的exec系统方法同Unix的exec系统调用是一致的。这些方法适用于在子进程中调用外部程序的情况,因为外部程序会替换当前进程的代码,不会返回。( 这个看了点 help(os)  --> search "exec" 的相关介绍,但是没太搞明白咋使用)


1.2. os模块的system方法

system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。

[python] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. >>> import os  
  2. >>> os.system("echo \"Hello World\"")   # 直接使用os.system调用一个echo命令  
  3. Hello World         ——————> 打印命令结果  
  4. 0                   ——————> What's this ? 返回值?  
  5. >>> val = os.system("ls -al | grep \"log\" ")   # 使用val接收返回值  
  6. -rw-r--r--  1 root       root       6030829 Dec 31 15:14 log    ——————> 此时只打印了命令结果  
  7. >>> print val             
  8. 0                   ——————> 注意,此时命令正常运行时,返回值是0  
  9. >>> val = os.system("ls -al | grep \"log1\" ")  
  10. >>> print val         
  11. 256                 ——————> 使用os.system调用一个没有返回结果的命令,返回值为256~  
  12. >>>   


注意:上面说了,此方法脂肪会外部程序的结果,也就是os.system的结果,所以如果你想接收命令的返回值,接着向下看~

 

1.3. os模块的popen方法

当需要得到外部程序的输出结果时,本方法非常有用,返回一个类文件对象,调用该对象的read()或readlines()方法可以读取输出内容。比如使用urllib调用Web API时,需要对得到的数据进行处理。os.popen(cmd) 要得到命令的输出内容,只需再调用下read()或readlines()等 如a=os.popen(cmd).read()

 

[python] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. >>> os.popen('ls -lt')                  # 调用os.popen(cmd)并不能得到我们想要的结果  
  2. <open file 'ls -lt ', mode 'r' at 0xb7585ee8>  
  3. >>> print os.popen('ls -lt').read()     # 调用read()方法可以得到命令的结果  
  4. total 6064  
  5. -rwxr-xr-x 1 long       long            23 Jan  5 21:00 hello.sh  
  6. -rw-r--r-- 1 long       long           147 Jan  5 20:26 Makefile  
  7. drwxr-xr-x 3 long       long          4096 Jan  2 19:37 test  
  8. -rw-r--r-- 1 root       root       6030829 Dec 31 15:14 log  
  9. drwxr-xr-x 2 long       long          4096 Dec 28 09:36 pip_build_long  
  10. drwx------ 2 Debian-gdm Debian-gdm    4096 Dec 23 19:08 pulse-gylJ5EL24GU9  
  11. drwx------ 2 long       long          4096 Jan  1  1970 orbit-long  
  12. >>> val = os.popen('ls -lt').read()     # 使用变量可以接收命令返回值  
  13. >>> if "log" in val:                    # 我们可以使用in来判断返回值中有木有一个字符串  
  14. ...     print "Haha,there is the log"  
  15. ... else:  
  16. ...     print "No,not happy"  
  17. ...  
  18. Haha,there is the log  



2. commands 模块

 

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

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

[python] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. long@zhouyl:/tmp/tests$ python  
  2. Python 2.7.3 (default, Jan  2 201316:53:07)   
  3. [GCC 4.7.2] on linux2  
  4. Type "help""copyright""credits" or "license" for more information.  
  5. >>> import commands  
  6. >>> commands.getstatusoutput('ls -lt')      # 返回(status, output)  
  7. (0'total 5900\n-rwxr-xr-x 1 long long      23 Jan  5 21:34 hello.sh\n-rw-r--r-- 1 long long     147 Jan  5 21:34 Makefile\n-rw-r--r-- 1 long long 6030829 Jan  5 21:34 log')  
  8. >>> commands.getoutput('ls -lt')            # 返回命令的输出结果(貌似和Shell命令的输出格式不同哈~)  
  9. 'total 5900\n-rwxr-xr-x 1 long long      23 Jan  5 21:34 hello.sh\n-rw-r--r-- 1 long long     147 Jan  5 21:34 Makefile\n-rw-r--r-- 1 long long 6030829 Jan  5 21:34 log'  
  10. >>> commands.getstatus('log')               # 调用commands.getoutput中的命令对'log'文件进行相同的操作  
  11. '-rw-r--r-- 1 long long 6030829 Jan  5 21:34 log'  
  12. >>>   



3. subprocess模块


根据Python官方文档说明,subprocess模块用于取代上面这些模块。有一个用Python实现的并行ssh工具—mssh,代码很简短,不过很有意思,它在线程中调用subprocess启动子进程来干活。

[python] view plaincopy在CODE上查看代码片派生到我的代码片
 
  1. >>> from subprocess import call  
  2. >>> call(["ls""-l"])  


subprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等..)。我认为使用os.system已过时,或即将过时。

4. 众方法的比较以及总结

4.1. 关于 os.system 

os.system("some_command with args")将命令以及参数传递给你的系统shell,这很好,因为你可以用这种方法同时运行多个命令并且可以设置管道以及输入输出重定向。比如:
os.system("some_command < input_file | another_command > output_file")
然而,虽然这很方便,但是你需要手动处理shell字符的转义,比如空格等。此外,这也只能让你运行简单的shell命令而且不能运行外部程序。

4.2. 关于os.popen

使用stream = os.popen("some_command with args")也能做与os.system一样的事,与os.system不同的是os.popen会返回一个类文件对象,使用它来访问标准输入、输出。

4.3. 关于subprocess.popen

subprocess模块的Popen类,意图作为os.popen的替代,但是因为其很全面所以比os.popen要显得稍微复杂
比如你可以使用  print Popen("echo Hello World", stdout=PIPE, shell=True).stdout.read()  来替代  print os.popen("echo Hello World").read()。但是相比之下它使用一个统一的类包括4中不同的popen函数还是不错的。

4.4. 关于subprocess.call

subprocess模块的call函数。它基本上就像Popen类并都使用相同的参数,但是它只简单的等待命令完成并给你返回代码。比如:
return_code = subprocess.call("echo Hello World", shell=True)


os模块中还有C中那样的fork/exec/spawn函数,但是我不建议直接使用它们。
subprocess可能更加适合你。


===========================================
[1] http://demi-panda.com/2013/01/25/python-shell-command/index.html
[2] http://m.blog.csdn.net/blog/overstack/9295995
[3] http://blog.csdn.net/swiftshow/article/details/7755543

下面是对于文中所涉及的内容的python官方文档:

[4] http://docs.python.org/library/subprocess.html#replacing-older-functions-with-the-subprocess-module       -- 关于使用subprocess 替代老的方法

[5] http://docs.python.org/lib/os-process.html     -- os的exec方法族以及system方法

[6] http://docs.python.org/lib/os-newstreams.html    -- os的popen方法

[7] http://docs.python.org/lib/node528.html    -- os的subprocess介绍

 

 

转:http://blog.csdn.net/my2010sam/article/details/18315785

分享到:
评论

相关推荐

    在python 中实现运行多条shell命令

    本文介绍了在Python中执行多条Shell命令的几种常见方法,包括使用`subprocess`模块、`os`模块以及编写Shell脚本并调用。每种方法都有其适用场景和局限性,开发者应根据具体需求选择最合适的方法。同时,在处理外部...

    Python3 执行Linux Bash命令的方法

    和之前C++执行Linux Bash命令的方法 一样,Python依然支持system调用和popen()函数来执行linux bash命令。 方法一:system调用 #仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 import os os....

    Python-linux高级命令教程及代码

    Python-linux高级命令教程及代码Python-linux高级命令教程及代码Python-linux高级命令教程及代码Python-linux高级命令教程及代码Python-linux高级命令教程及代码Python-linux高级命令教程及代码Python-linux高级命令...

    Python下调用Linux的Shell命令的方法

    总结来说,当你需要在Python脚本中调用Linux Shell命令时,应优先考虑使用`subprocess`模块,因为它提供了更丰富的功能和更好的错误处理。`os`模块的`system`和`popen`方法在简单场景下也足够用,但功能相对有限。...

    python调用shell命令

    本文将详细介绍如何使用Python来调用Shell命令,并重点介绍`os.popen()`与`os.system()`两种方法的区别及其应用场景。 #### 二、基础知识 1. **Python中的os模块**:`os`是Python的标准库之一,提供了与操作系统...

    python 执行shell命令并将结果保存的实例

    本文将详细介绍如何使用Python标准库中的subprocess模块来执行shell命令,并将命令的执行结果保存到字符串变量中以及写入到指定的文件中。 首先,我们来看如何将shell命令执行的结果保存到字符串中。在Python中,...

    pycharm中执行window环境python脚本多条shell命令

    在Windows环境中使用PyCharm编写Python脚本并执行shell命令时,由于Windows与Linux等其他操作系统的命令差异,会遇到一些特殊的问题。本文将详细介绍如何在Windows环境下通过PyCharm执行shell命令,并解决实际开发...

    Python2.x利用commands模块执行Linux shell命令

    用Python写运维脚本时,经常需要执行linux shell的命令,Python中的commands模块专门用于调用Linux shell命令,并返回状态和结果,下面是commands模块的3个主要函数: 1. commands.getoutput(‘shell command’) ...

    最牛B的Linux_Shell命令

    标题《最牛B的Linux_Shell命令》所指向的知识点覆盖了Linux中Shell命令的强大和便捷性,尤其是在完成系统管理任务时的实用性。Shell命令之所以重要,是因为它们充当了用户和操作系统之间的接口,能够调用和控制底层...

    python中利用adb shell 控制手机,完美解决中文输入问题

    总结来说,这篇博文的核心在于使用Python和ADB工具解决安卓设备上的中文输入问题,通过发送shell命令和模拟按键事件,或者借助特定的输入法应用,来实现自动化过程中的中文输入控制。这种方法对于进行自动化测试、...

    python2.6.4 for linux

    python 2.6.4 for linux python 2.6.4 for linux python 2.6.4 for linux

    用Python脚本实现对Linux服务器的监控

    目前Linux下有一些使用Python语言编写的Linux系统监控工具比如inotify-sync(文件系统安全监控软件)、glances(资源监控工具)在实际工作中,Linux系统管理员可以根据自己使用的服务器的具体情况编写一下简单实用的...

    用Python加持Linux Shell脚本编写CSV文件即可完美解决脚本中的返回

    将Python集成到Linux Shell脚本中,可以利用`python -c`或`python3 -c`命令执行Python代码片段,或者编写一个Python脚本并用`python script.py`来运行。例如: ```bash #!/bin/bash # 使用Python处理CSV python3 -...

    《C 语言实现 Linux Shell 命令解释器》项目.zip

    《C 语言实现 Linux Shell 命令解释器》项目可以培养 Linux 系统编程能力,尤其是在多进程方面。可以了解fork、execvp 等重要的系统调用。另外还能深入到底层理解 Linux Shell 的功能的实现手段。 软件开发设计:...

    Python-用busybox加持的功能更加强大的adbshell不需要root

    在标题和描述中提到的"Python-用busybox加持的功能更加强大的adb shell不需要root",是关于如何通过集成BusyBox来增强ADB Shell的功能,而且无需设备具有root权限。 BusyBox是一个开源项目,它集成了许多常见的...

    linux-python3.8.5.zip

    1. 解压缩文件:使用`unzip linux-python3.8.5.zip`命令将文件解压到当前目录。 2. 执行安装脚本:如果包含自解压脚本,通常会有一个名为`setup.sh`或`install.sh`的文件,用户需使用`sudo bash install.sh`来运行...

    LINUX SHELL编程从初学到精通

    1. Shell基础:学习Shell的基本语法和结构,包括变量定义、基本命令的使用、输入输出重定向、管道(pipe)的使用等。这些基础知识是编写Shell脚本不可或缺的。 2. 脚本编写:掌握如何编写Shell脚本,通常以#!/bin/...

    python文件读写操作与linux shell变量命令交互执行的方法

    Python提供了多种方式与Linux Shell命令进行交互,其中最常见的方法是使用`os`模块。 #### 执行Linux命令 - `os.system(command)`:此函数可以直接执行Shell命令,并返回命令的退出状态。 ```python os.system('...

Global site tag (gtag.js) - Google Analytics