python调用shell命令之三大方法

preface: 忙于最近的任务,需要用到libsvm的一些命令,如在终端运行java
svm_train train_file model_file. pythonsubset.py file train_num train_file test_file等命令,但file的准备又是通过python写好的,file需要是libsvm能够接受的格式,故用python写好特征,转为libsvm能够接受的格式,生成file,然后在终端调用训练。故想着直接在python代码里面直接运行终端的命令。博友博客描述得很详细,这里直接转载过来并做些注释了。

#=====================================================

一、os 模块

1.1.os模块的exec方法簇:

ipython交互界面中:

In [1]: import os

In [2]: os.exec
os.execl    os.execlp   os.execv    os.execvp
os.execle   os.execlpe  os.execve   os.execvpe  

In [2]: os.execl?
Type:        function
String form: <function execl at 0xb73673e4>
File:        /home/shifeng/anaconda/lib/python2.7/os.py
Definition:  os.execl(file, *args)
Docstring:
execl(file, *args)

Execute the executable file with argument list args, replacing the
current process.

os.exec+Tab键智能提示可以看到有8个,help(os.execl)等可以找到其用法说明。

1.2.os模块的system方法

system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。0表示运行成功。

In [10]: os.system("echo \"hello world\"")
hello world
Out[10]: 0

In [11]: os.system("ls")
all_roc_plot.py~  task1_feature_all2.py  test.py   test.sh   ui_without_buy~
scrapy_work	  test			 test.py~  test.sh~
Out[11]: 0

In [12]: os.system("cat test.sh")
echo "hello world"
Out[12]: 0

In [13]: os.system("sh test.sh")
hello world
Out[13]: 0

如上,一些基本的shell命令,传入os.system()参数里面,便能执行。不过无法得到命令的返回值。

1.3.os模块popen方法

popen方法能够得到shell命令的返回值,os.popen(cmd)后,需要再调用read()或者readlines()这两个命令。输出结果。

In [14]: os.popen("ls")
Out[14]: <open file 'ls', mode 'r' at 0xb67efd30>

In [15]: os.popen("ls").read()
Out[15]: 'all_roc_plot.py~\nscrapy_work\ntask1_feature_all2.py\ntest\ntest.py\ntest.py~\ntest.sh\ntest.sh~\nui_without_buy~\n'

In [16]: os.popen("ls").readlines()
Out[16]:
['all_roc_plot.py~\n',
 'scrapy_work\n',
 'task1_feature_all2.py\n',
 'test\n',
 'test.py\n',
 'test.py~\n',
 'test.sh\n',
 'test.sh~\n',
 'ui_without_buy~\n']

In [17]: s = os.popen("ls").read()

In [18]: for i in s.split("\n"):
   ....:     print i
   ....:
all_roc_plot.py~
scrapy_work
task1_feature_all2.py
test
test.py
test.py~
test.sh
test.sh~
ui_without_buy~

注意,read()或者readlines()后,其每个元素包含一个回车符\n。

二、commands模块

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

主要方法:

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

*   commands.getoutput(cmd)                   只返回输出结果

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

In [8]: import commands 

In [9]: commands.getoutput("ls")
Out[9]: 'all_roc_plot.py~\nscrapy_work\ntask1_feature_all2.py\ntest\ntest.py\ntest.py~\ntest.sh\ntest.sh~\nui_without_buy~'

In [10]: commands.getstatusoutput("ls")
Out[10]:
(0,
 'all_roc_plot.py~\nscrapy_work\ntask1_feature_all2.py\ntest\ntest.py\ntest.py~\ntest.sh\ntest.sh~\nui_without_buy~')

三、subprocess模块

使用subprocess模块可以创建新的进程,可以与新建进程的输入/输出/错误管道连通,并可以获得新建进程执行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。

3.1.subprocess.call(["some_command","some_argument","another_argument_or_path"])

subprocess.call(command,shell=True)

3.2.subprocess.Popen(command,shell=True)

如果command不是一个可执行文件,shell=True不可省。

使用subprocess模块可以创建新的进程,可以与新建进程的输入/输出/错误管道连通,并可以获得新建进程执行的返回状态。使用subprocess模块的目的是替代os.system()、os.popen*()、commands.*等旧的函数或模块。

最简单的方法是使用classsubprocess.Popen(command,shell=True)。Popen类Popen.stdin,Popen.stdout,Popen.stderr三个有用的属性,可以实现与子进程的通信。

In [11]: from subprocess import  call

In [12]: call(["ls","-l"])
总用量 40
-rw-rw-r-- 1 shifeng shifeng  3266  5月  3 14:14 all_roc_plot.py~
drwxrwxr-x 6 shifeng shifeng  4096  6月 18 16:59 scrapy_work
-rw-rw-r-- 1 shifeng shifeng 12786  6月 10 10:20 task1_feature_all2.py
drwxrwxr-x 2 shifeng shifeng  4096  6月  8 11:36 test
-rw-rw-r-- 1 shifeng shifeng  3649  6月 19 10:21 test.py
-rw-rw-r-- 1 shifeng shifeng   255  6月 11 21:21 test.py~
-rw-rw-r-- 1 shifeng shifeng    19  6月 25 19:49 test.sh
-rw-rw-r-- 1 shifeng shifeng     0  6月 25 19:49 test.sh~
-rw-rw-r-- 1 shifeng shifeng     0  4月  8 22:15 ui_without_buy~
Out[12]: 0

In [13]: from subprocess import  Popen

In [14]: Popen(["ls","-l"])
Out[14]: <subprocess.Popen at 0xb67c91ac>

In [15]: 总用量 40
-rw-rw-r-- 1 shifeng shifeng  3266  5月  3 14:14 all_roc_plot.py~
drwxrwxr-x 6 shifeng shifeng  4096  6月 18 16:59 scrapy_work
-rw-rw-r-- 1 shifeng shifeng 12786  6月 10 10:20 task1_feature_all2.py
drwxrwxr-x 2 shifeng shifeng  4096  6月  8 11:36 test
-rw-rw-r-- 1 shifeng shifeng  3649  6月 19 10:21 test.py
-rw-rw-r-- 1 shifeng shifeng   255  6月 11 21:21 test.py~
-rw-rw-r-- 1 shifeng shifeng    19  6月 25 19:49 test.sh
-rw-rw-r-- 1 shifeng shifeng     0  6月 25 19:49 test.sh~
-rw-rw-r-- 1 shifeng shifeng     0  4月  8 22:15 ui_without_buy~

1、subprocess.call(command, shell=True)#会直接打印出结果。

2、subprocess.Popen(command, shell=True) 也可以是subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) 这样就可以输出结果了。如果command不是一个可执行文件,shell=True是不可省略的。shell=True意思是shell下执行command。

#========================以下转载============

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会给你一个像文件的对象从而你可以使用它来访问哪个程序的标准输入、输出。而且popen还有三个变种都是在I/O处理上有轻微不同。假如你通过一个字符串传递所有东西,你的命令会传递给shell;如果你通过一个列表传递他们,你不用担心逃避任何事。

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)

#==========================================

参考:

1.博友博客:http://blog.csdn.net/longerzone/article/details/17889969

2.博友博客:http://zhou123.blog.51cto.com/4355617/1312791

时间: 2024-12-17 02:31:26

python调用shell命令之三大方法的相关文章

python 调用shell命令三种方法

#!/usr/bin/python是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器: #!/usr/bin/env python这种用法是为了防止操作系统用户没有将python装在默认的/usr/bin路径里. python调用shell命令的方法有许多 1.1   os.system(command) 在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态.这实际上是使用C标准库函数system()实现的.这个函数在执行comman

python 调用shell命令的方法

在python程序中调用shell命令,是件很酷且常用的事情…… 1. os.system(command) 此函数会启动子进程,在子进程中执行command,并返回command命令执行完毕后的退出状态,如果command有执行内容,会在标准输出显示.这实际上是使用C标准库函数system()实现的. 缺点:这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果. 实例:os.system('ls -l *') 2. os.popen(command,

python调用shell命令

1.1   os.system(command) 在一个子shell中运行command命令,并返回command命令执行完毕后的退出状态.这实际上是使用C标准库函数system()实现的.这个函数在执行command命令时需要重新打开一个终端,并且无法保存command命令的执行结果. 1.2   os.popen(command,mode) 打开一个与command进程之间的管道.这个函数的返回值是一个文件对象,可以读或者写(由mode决定,mode默认是'r').如果mode为'r',可以

测试:python调用cmd命令三种方法

目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码,高位为脚本的退出状态码,即脚本中"exit 1"的代码执行后,os.system函数返回值的高位数则是1,如果低位数是0的情况下,则函数的返回值是0×100,换算为10进制得到256. 如果我们需要获得os.system的正确返回值,那使用位移运算可以还原返回值: >>>

python调用shell命令小结

在写python脚本的时候,经常需要调用系统命令,常用的python调用系统命令的方法主要有subprocess.call和os.popen.默认情况下subprocess.call的方法结果是返回值,即1或0,而os.popen则是命令运行的结果,可以用readlines(读取所有行,返回数组)或者read(读读取所有行,返回str)来读取. subprocess类总主要的方法有: subprocess.call:开启子进程,开启子进程,运行命令,默认结果是返回值,不能try subproce

python调用shell命令之三慷慨法

preface: 忙于近期的任务,须要用到libsvm的一些命令.如在终端执行java svm_train train_file model_file. pythonsubset.py file train_num train_file test_file等命令.但file的准备又是通过python写好的.file须要是libsvm可以接受的格式.故用python写好特征.转为libsvm可以接受的格式.生成file,然后在终端调用训练.故想着直接在python代码里面直接执行终端的命令.博友博

Python 调用 shell 命令的模块总结

os.system('cat /proc/cpuinfo') 阻塞,返回shell执行参数命令的状态,即成功返回0 os.popen('cat /proc/cpuinfo') 阻塞,返回file read的对象,对该对象进行 read() 可以获取shell执行参数命令的结果,即标准输出 commands.getstatus('/proc/cputinfo') 阻塞,返回参数指定的系统文件的详细属性 commands.getoutput('cat /proc/cpuinfo') 阻塞,返回she

解析如何在C语言中调用shell命令的实现方法【转】

本文转自:http://www.jb51.net/article/37404.htm 1.system(执行shell 命令)相关函数 fork,execve,waitpid,popen表头文件 #include<stdlib.h>定义函数 int system(const char * string);函数说明 system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程.在调用syst

[蟒蛇菜谱] Python调用shell命令,获取返回值和返回信息

# -*- coding: utf-8 -*- import os import subprocess import signal class MockLogger(object): '''模拟日志类.方便单元测试.''' def __init__(self): self.info = self.error = self.critical = self.debug def debug(self, msg): print "__LOGGER__:"+msg class Shell(obj