博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Python】执行系统命令的常见用法
阅读量:6691 次
发布时间:2019-06-25

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

本文总结了使用Python 程序执行系统的几种命令,介绍各个模块的优缺点。
os.system模块

仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息,如果在命令行下执行,结果直接打印出来

Python 2.6.6 (r266:84292, May 29 2014, 05:49:27)  [GCC 4.4.6 20110731 (Red Hat 4.4.6-3)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import os>>> os.system('cat cont')biz_order_idout_order_idbuy_nicksel_nickbuyersel0>>> out=os.system('cat cont')biz_order_idout_order_idbuy_nicksel_nickbuyersel>>>
缺点: 
a.os.system() 是新起一个shell执行命令 
b.不能利用其它变量存放os.system()执行的结果,获得输出等信息比较麻烦.
c.无法控制命令执行的状态,(如果调用的外部命令,挂死或者执行时间很长),主进程无法控制os.system(), 因为调用os.system(cmd) 调用进程会block,直到 os.system()命令结束自己退出。 
os.popen模块
通过 os.popen() 返回的是 file read 的对象,对其进行读取 read() 的操作可以看到执行的输出。
例子1

>>> output = os.popen('date') >>> print output
>>> print output.read()Sun Sep 13 22:34:56 CST 2015
例子2

>>> output = os.popen('cat cont').readlines() ##返回一个数组 >>> print output['biz_order_id\n', 'out_order_id\n', 'buy_nick\n', 'sel_nick\n', 'buyer\n', 'sel\n']>>> print output[0]biz_order_id
优点
1 该方法不但执行命令还返回执行后的信息对象,将返回的结果赋于一变量,便于程序的处理。
缺点
1 无法获取命令的执行结果的状态。
commands模块
和os.system的执行方式类似,在子系统终端执行命令。该模块包含如下三种函数:
commands.getstatusoutput(cmd)
commands.getoutput(cmd) 返回命令的执行结果
commands.getstatus(file) 返回 ls -ld file 的执行结果。

>>> output=commands.getoutput("date") >>> print outputSun Sep 13 22:37:44 CST 2015>>> status=commands.getstatus("date")>>> print statusls: cannot access date: No such file or directory>>> commands.getstatus('/bin/ls')'-rwxr-xr-x 1 root root 111744 May 29 2014 /bin/ls'>>> st=commands.getstatus('/bin/ls')>>> print st-rwxr-xr-x 1 root root 111744 May 29 2014 /bin/ls>>> status,output=commands.getstatusoutput("ls yy") >>> print status,output512 ls: cannot access yy: No such file or directory
优点: 
a.容易获得外部命令的结果输出和命令执行的状态 
缺点: 
b.不能利用其它变量存放os.system()执行的结果,获得输出等信息比较麻烦.
c.无法控制命令执行的状态,(如果调用的外部命令,挂死或者执行时间很长),主进程无法控制os.system(), 因为调用os.system(cmd) 调用进程会block,直到 os.system()命令结束自己退出。 
需要注意事的是 该模块已经在 python 3 中被废弃了,推荐使用 subprocess代替。
subprocess 模块
运行python的时候,我们都是在创建并运行一个进程。像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序。在Python中,通过标准库中的subprocess包来fork一个子进程,并运行一个外部的程序。详细资料请参考

>>> import subprocess >>> subprocess.call(["ls", "-l"])total 20-rwxr-xr-x 1 qilong.yangql users 14 Dec 30 2014 a-rw-r--r-- 1 qilong.yangql users 54 Sep 13 22:22 cont-rwxr-xr-x 1 root root 19 Jun 1 11:01 d-rw-r--r-- 1 root root 68 Jul 7 09:45 databasedrwxr-xr-x 3 qilong.yangql users 4096 Jan 11 2015 dbscripts0>>> subprocess.call(["ls"]) a cont d database dbscripts0>>> Popen = subprocess.Popen(["date"])>>> Sun Sep 13 22:57:08 CST 2015>>> Popen.pid
优点
1 支持和子进程交互 
2 支持命令结果输出
3 可以使用kill()  ,terminate() 来控制子进程退出 
4 还有很多请参考官方文档。

转载地址:http://hhuoo.baihongyu.com/

你可能感兴趣的文章
Ext概述
查看>>
LeetCode – Refresh – Populating Next Right Pointers in Each Node I and II
查看>>
Well, now we should make Discount mbt shoes
查看>>
securecrt中使用上传下载sftp
查看>>
[导入]WAP 技术
查看>>
让SWF文件从原始保存位置拿出来到任意位置都可以播放的设置
查看>>
chm格式文档不能阅读问题
查看>>
FIS本地发布-其他同事通过IP访问
查看>>
圆的半径的算法
查看>>
centos安装python-opencv
查看>>
基于Google排名因素对Drupal进行SEO优化
查看>>
action中redirectAction到另一个命名空间中的action该如何配置
查看>>
label标签利用jquery获取值得方式为$("#message").html()
查看>>
javascript创建Ajax对象
查看>>
php文件缓存
查看>>
思考方式--教会你如何去思考!
查看>>
mysql库的操作
查看>>
c++的getline()和get()函数
查看>>
面向对象第一单元总结
查看>>
模拟购物车
查看>>