`

Python下调用Linux的Shell命令用subprocess

阅读更多

        有时候难免需要直接调用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介绍

分享到:
评论

相关推荐

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

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

    Python3 执行Linux Bash命令的方法

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

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

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

    Python-何用Python代替Bash脚本指南

    下面,我们将深入探讨为何以及如何用Python来代替Bash脚本。 1. **Python的易读性和可维护性** Bash脚本往往依赖于命令行参数和环境变量,这可能导致代码难以理解,特别是对于大型项目。Python的语法结构清晰,有...

    Python如何通过subprocess调用adb命令详解

    本文主要给大家介绍了关于使用Python通过subprocess调用adb命令,subprocess包主要功能是执行外部命令(相对Python而言)。和shell类似。 换言之除了adb命令外,利用subprocess可以执行其他的命令,比如ls,cd等等...

    python调用shell命令

    在进行系统自动化运维或脚本编程时,经常需要从Python脚本中调用Shell命令来执行特定任务,如文件管理、网络操作等。本文将详细介绍如何使用Python来调用Shell命令,并重点介绍`os.popen()`与`os.system()`两种方法...

    基于 python subprocess 实现的定时任务系统源码.zip

    python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 python subprocess 实现的定时任务系统源码.zip基于 ...

    Python之使用adb shell命令启动应用的方法详解

    要使用`adb shell`命令启动Android应用,首先需要了解基本的命令格式以及如何通过Python脚本来调用这些命令。 **基本命令格式**: ```sh adb shell am start -n &lt;package&gt;/ ``` 这里 `&lt;package&gt;` 是指应用的包名,`...

    python调用shell脚本

    此外,如果你的shell脚本是bash脚本,你也可以考虑使用`os/exec`模块的`Popen`或`subprocess.Popen`,并将`shell=True`作为参数传递,这样Python就会使用系统默认的shell(通常是bash)来执行命令: ```python ...

    使用python执行shell脚本 并动态传参 及subprocess的使用详解

    在Python编程中,有时我们需要执行外部的shell命令或者脚本,这时可以借助内置的`subprocess`模块。本文将深入探讨如何使用Python执行shell脚本、动态传递参数以及`subprocess`模块的详细使用。 首先,`subprocess`...

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

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

    Python调用shell命令常用方法(4种)

    ### Python调用Shell命令的四种常见方法 #### 方法一:使用`os`模块的`system`方法 在Python中,`os`模块提供了一系列与操作系统交互的接口,其中包括`system`函数,它允许我们直接执行Shell命令。此方法简单易用...

    Python Unix和Linux系统管理指南

    5. **系统接口与系统调用**:通过Python的os和subprocess模块,可以直接调用Unix/Linux的命令行工具,执行shell脚本,或者使用系统调用进行更底层的操作。 6. **自动化任务**:自动化是Python在系统管理中的主要...

    Python.Unix和Linux系统管理指南 源代码

    Python的`subprocess`模块可以用来启动、控制和通信与子进程,这对于执行shell命令和管理系统服务非常有用。此外,`psutil`库则提供了获取系统和进程信息的接口。 4. **网络通信**: Python的`socket`库用于网络...

    python连接ssh 远程操作linux命令行

    Python SSH库,如Paramiko和ssh模块,是用于在Windows环境下连接到Linux服务器并执行远程命令的强大工具。本文将深入探讨如何使用Python实现这一功能,以及它可以带来的各种可能性。 首先,`Paramiko`是一个实现...

    Python 从subprocess运行的子进程中实时获取输出的例子

    在Python编程中,有时我们需要创建子进程来执行外部命令或脚本,以便于任务调度、资源管理和并发操作。`subprocess`模块是Python提供的一种强大工具,它允许我们方便地创建子进程并与其进行交互。本文将深入探讨如何...

    python subprocess 杀掉全部派生的子进程方法

    在Python编程中,使用`subprocess`模块来执行外部命令或程序是非常常见的需求。然而,在某些场景下,我们需要能够有效地终止这些子进程及其所有派生的子进程。本文将详细介绍如何在不同操作系统(如Windows和Linux)...

Global site tag (gtag.js) - Google Analytics