python调用shell命令之三慷慨法

枫铃3年前 (2021-07-10)Python296

preface: 忙于近期的任务,须要用到libsvm的一些命令。如在终端执行javasvm_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表示执行成功。

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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。不建议使用此方法
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006 
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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  53 14:14 all_roc_plot.py~
drwxrwxr-x 6 shifeng shifeng  4096  618 16:59 scrapy_work
-rw-rw-r-- 1 shifeng shifeng 12786  610 10:20 task1_feature_all2.py
drwxrwxr-x 2 shifeng shifeng  4096  68 11:36 test
-rw-rw-r-- 1 shifeng shifeng  3649  619 10:21 test.py
-rw-rw-r-- 1 shifeng shifeng   255  611 21:21 test.py~
-rw-rw-r-- 1 shifeng shifeng    19  625 19:49 test.sh
-rw-rw-r-- 1 shifeng shifeng     0  625 19:49 test.sh~
-rw-rw-r-- 1 shifeng shifeng     0  48 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  53 14:14 all_roc_plot.py~
drwxrwxr-x 6 shifeng shifeng  4096  618 16:59 scrapy_work
-rw-rw-r-- 1 shifeng shifeng 12786  610 10:20 task1_feature_all2.py
drwxrwxr-x 2 shifeng shifeng  4096  68 11:36 test
-rw-rw-r-- 1 shifeng shifeng  3649  619 10:21 test.py
-rw-rw-r-- 1 shifeng shifeng   255  611 21:21 test.py~
-rw-rw-r-- 1 shifeng shifeng    19  625 19:49 test.sh
-rw-rw-r-- 1 shifeng shifeng     0  625 19:49 test.sh~
-rw-rw-r-- 1 shifeng shifeng     0  48 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)

相关文章

python中的偏函数

偏函数:...

scrapy爬取某招聘网手机APP发布信息

scrapy爬取某招聘网手机APP发布信息

1 引言 ​ 过段时间要开始找新工作了,爬取一些岗位信息来分析一下吧。目前主流的招聘网站包括前程无忧、智联、BOSS直聘、拉勾等等。有段时间时...

Python高手必读,做一个精通规则的玩家

编程,其实和玩电子游戏有一些相似之处。你在玩不同游戏前,需要先学习每个游戏的不同规则,只有熟悉和灵活运用游戏规则&#...

python 的dict的append()?

看我下面这个表达...

python解析XML

1.xml简介 XML...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。