python中执行linux命令(调用linux命令)_常见Python中调用Linux命令
有时候我们需要从Python中执行Linux命令,下面就介绍几种方法?
1. os 模块:
1.1 os.system 函数:
system方法会创建子进程运行外部程序,方法只返回外部程序的运行结果。这个方法比较适用于外部程序没有输出结果的情况。
>>> os.system('echo \ "Hello World\"') # 直接使用os.system调用一个echo命令
Hello World
0>>> os.system("cat /proc/meminfo")
MemTotal:486640kB
MemFree:301184kB
Buffers:10304kB
Cached:58316kB
SwapCached: 0 kB
Active:43748kB
Inactive:45336kB
Active(anon):20476kB
Inactive(anon):520kB
Active(file):23272kB
Inactive(file):44816 kB
注意:上面说了,此方法只会外部程序的结果,也就是os.system的结果,所以如果你想接收命令的返回值,接着向下看
1.2 os模块的popen方法
当需要得到外部程序的输出结果时,本方法非常有用,返回一个类文件对象,调用该对象的read()或readlines()方法可以读取输出内容。
>>> print(os.popen('ls -lt')) # 是以一个类文件对象的形式
>>> print(os.popen('ls -lt').read())
总用量98drwxr-xr-x. 2 root root 4096 5月 19 04:26opt
dr-xr-x---. 3 root root 4096 5月 19 04:26root
drwxr-xr-x. 19 root root 3760 5月 19 04:22dev
drwxr-xr-x. 78 root root 4096 5月 19 04:22etc
drwxrwxrwt.7 root root 4096 5月 19 04:22tmp>>> print(os.popen('ls -lt').readlines())
readlines()是以列表的形式打印出来
2. commands 模块(在Python2.X中纯在Python3中就移除了,在Python 3.X 中 被 sudprocess 取代,这里就不怎么介绍commands模块了)
使用commands模块的getoutput方法,这种方法同popend的区别在于popen返回的是一个类文件对象,而本方法将外部程序的输出结果当作字符串返回,很多情况下用起来要更方便些。
主要方法:
* commands.getstatusoutput(cmd) 返回(status, output)
* commands.getoutput(cmd) 只返回输出结果
* commands.getstatus(file) 返回ls -ld file的执行结果字符串,调用了getoutput,不建议使用此方法
3. subprocess 模块
官方文档: https://docs.python.org/3/library/subprocess.html
subprocess模块用于取代上面这些模块。ubprocess与system相比的优势是它更灵活(你可以得到标准输出,标准错误,“真正”的状态代码,更好的错误处理,等..)。我认为使用os.system已过时,或即将过时。
3.1 call 执行命令,返回状态码(命令正常执行返回0,报错则返回1)
1 >>> ret = subprocess.call('df -h', shell='True')2 Filesystem Size Used Avail Use%Mounted on3 /dev/mapper/VolGroup-lv_root4 18G 1.7G 15G 10% /
5 tmpfs 238M 0 238M 0% /dev/shm6 /dev/sda1 477M 38M 414M 9% /boot7
8 #两种不同的写法
9
10 >>> ret = subprocess.call(["ls", "-l"], shell=False) #shell为False的时候命令必须分开写
11 总用量 24
12 -rw-------. 1 root root 1068 8月 28 2018 anaconda-ks.cfg13 -rw-r--r--. 1 root root 14484 8月 28 2018install.log14 -rw-r--r--. 1 root root 3482 8月 28 2018 install.log.syslog
>>> print(ret)
0
3.2 check_call 执行命令,如果执行成功则返回状态码0,否则抛异常
1 >>> ret = subprocess.check_call(['ls', '-l'], shell='False')2 anaconda-ks.cfg install.log install.log.syslog3 >>> print(ret)4 05
6 >>> ret = subprocess.check_call('ls -l', shell='True')7 总用量 24
8 -rw-------. 1 root root 1068 8月 28 2018 anaconda-ks.cfg9 -rw-r--r--. 1 root root 14484 8月 28 2018install.log10 -rw-r--r--. 1 root root 3482 8月 28 2018 install.log.syslog
3.3 check_output 执行命令,如果执行成功则返回执行结果,否则抛异常。
>>> subprocess.check_output(['echo', "Hello, Word"])
b'Hello, Word\n'
>>> subprocess.check_output('ls -l', shell='True')
b'\xe6\x80\xbb\xe7\x94\xa8\xe9\x87\x8f 24\n-rw-------. 1 root root 1068 8\xe6\x9c\x88 28 2018 anaconda-ks.cfg\n-rw-r--r--. 1 root root 14484 8\xe6\x9c\x88 28 2018 install.log\n-rw-r--r--. 1 root root 3482 8\xe6\x9c\x88 28 2018 install.log.syslog\n'
返回结果为bays 类型, 不怎么常用这个
subprocess 模块 在Python3版本新加功能:(常用)
简要说明: 有需要用到python调用外部程序命令的同学们, 那么你们请一定选择subprocess库,它给我们工作带来极大的方便也许我这么解释不正确, 还是用官方的话来说吧 等这些。
subprocess.run()方法. 此方法作用: 使用参数运行命令并返回完整的进程实例
subprocess.run(*popenargs, input=None, timeout=None, check=False, **kwargs)
实例:
1 >>> subprocess.run(['ls', '-l']) # 注意 用[] 括号包着你要执行的命令,后面也可以跟路径 #相当于在系统中执行ls -l / 命令
2 总用量 24
3 -rw-------. 1 root root 1068 8月 28 2018 anaconda-ks.cfg4 -rw-r--r--. 1 root root 14484 8月 28 2018install.log5 -rw-r--r--. 1 root root 3482 8月 28 2018install.log.syslog6 CompletedProcess(args=['ls', '-l'], returncode=0)7 >>> subprocess.run(['ls', '-l' , '/']) # 这是跟路径的 查看的是根下的8 总用量 98
9 dr-xr-xr-x. 2 root root 4096 8月 28 2018bin10 dr-xr-xr-x. 5 root root 1024 8月 29 2018boot11 drwxr-xr-x. 19 root root 3760 5月 20 04:06dev12 drwxr-xr-x. 78 root root 4096 5月 20 04:06etc13 drwxr-xr-x. 2 root root 4096 6月 28 2011home14 dr-xr-xr-x. 8 root root 4096 8月 29 2018lib15 dr-xr-xr-x. 9 root root 12288 4月 26 08:08lib6416 drwx------. 2 root root 16384 8月 28 2018 lost+found
Popen
实际上,我们上面的三个函数都是基于Popen()的封装(wrapper)。这些封装的目的在于让我们容易使用子进程。当我们想要更个性化我们的需求的时候,就要转向Popen类,该类生成的对象用来代表子进程。
与上面的封装不同,Popen对象创建后,主程序不会自动等待子进程完成。我们必须调用对象的wait()方法,父进程才会等待 (也就是阻塞block):
[root@localhost opt]#vim 1.py#!/etc/svn/python
importsubprocessimportsubprocess
child= subprocess.Popen(["ping","-c","5","127.0.0.1"])print("parent 进程")
[root@localhost opt]#python3 1.py结果:
parent 进程 #父进程没有等子进程结束 直接执行的父进程 在执行的子进程
[root@localhost opt]#PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.023ms64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.030ms64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.030ms64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.030ms64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.031ms--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
对于等待的情况:
1 importsubprocess2 child = subprocess.Popen(["ping","-c","5","www.google.com"])3 child.wait()4 print("parent process")
此外,你还可以在父进程中对子进程进行其它操作,比如我们上面例子中的child对象:
child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.wait() # 等待子进程结束
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进程
子进程的PID存储在child.pid
stdin标准输入, stdout 标准输出, stderr 标准错误:
我们可以在Popen()建立子进程的时候改变标准输入、标准输出和标准错误,并可以利用subprocess.PIPE将多个子进程的输入和输出连接在一起,构成管道(pipe):
importsubprocess
a= subprocess.Popen(["ls","-l"], stdout=subprocess.PIPE)
b= subprocess.Popen(["wc"], stdin=a.stdout,stdout=subprocess.PIPE)
out=b.communicate() # 是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成print(out)
结果:
[root@localhost opt]# python3 test.py
(b' 3 20 117\n', None)
subprocess.PIPE实际上为文本流提供一个缓存区。a的stdout将文本输出到缓存区,随后b的stdin从该PIPE中将文本读取走。b的输出文本也被存放在PIPE中,直到communicate()方法从PIPE中读取出PIPE中的文本。
要注意的是,communicate()是Popen对象的一个方法,该方法会阻塞父进程,直到子进程完成。
python中执行linux命令(调用linux命令)_常见Python中调用Linux命令相关推荐
- oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到
oracle 数据库中执行数据库语句能找到数据,但是程序中却抓取不到? 原因:数据库中插入数据时没有commit,执行COMMIT后就可以查询到. 转载于:https://www.cnblogs.co ...
- python玩王者荣耀皮肤碎片怎么获得_用python的requests第三方模块抓取王者荣耀所有英雄的皮肤实例...
本文使用python的第三方模块requests爬取王者荣耀所有英雄的图片,并将图片按每个英雄为一个目录存入文件夹中,方便用作桌面壁纸 下面时具体的代码,已通过python3.6测试,可以成功运行: ...
- linux下hg无法运行_千万不要运行的 Linux 命令
本文中列出的命令绝对不可以运行,即使你觉得很好奇也不行,除非你是在虚拟机上运行(出现问题你可以还原),因为它们会实实在在的破坏你的系统.所以不在root等高级管理权限下执行命令是很好的习惯. 本文的目 ...
- linux自动输入sudo密码_用大写字母输入 Linux 命令,实现以 sudo 用户权限运行
我们知道,一些 Linux 命令是要通过 sudo 权限才能运行的,这需要我们每次使用这些命令时在前面加一个 sudo ,十分繁琐.今天给大家介绍一个好用的工具 SUDO ,它只需要我们用大写字母键入 ...
- python命令窗口在哪里_详解如何在cmd命令窗口中搭建简单的python开发环境
详解如何在cmd命令窗口中搭建简单的python开发环境 1.快捷键win+r输入cmd回车调出cmd界面,在命令行输入python回车,显示python命令无法识别 2.登陆python官网http ...
- linux将字符串转小写_小猿圈总结Linux常见命令(一)
科技发展的今天,互联网不断的发达,很多人学习Linux云计算的时候回因为记不住一些命令从而去找度娘,有时候因为因为找不到linux的命令而烦恼,下面是小猿圈linux讲师给大家总结的linux常见命令 ...
- python中执行shell脚本之subprocess模块_如何使用Python中的subprocess模块检查shell脚本的状态?...
我有一个简单的Python脚本,它将使用Python中的subprocessmdoule来执行shell脚本.在 下面是我的pythonshell脚本,它正在调用testing.shshell脚本,它 ...
- python如何封装成可调用的库_在python中如何以异步的方式调用第三方库提供的同步API...
在关于asyncio的基本用法中提到,asyncio并不是多线程.在协程中调用同步(阻塞函数),都占用同一线程的CPU时间,即当前线程会被阻塞(即协程只会在等待一个协程时可能出让CPU,如果是普通函数 ...
- python定义方法self会被当作变量_为什么Python必须在方法定义和调用中显式使用“self”?...
为什么Python必须在方法定义和调用中显示使用"self"? 这个想法借鉴了 Modula-3 语言.出于多种原因它被证明是非常有用的. 首先,更明显的显示出,使用的是方法或实例 ...
最新文章
- react-webpack-express
- F5服务器上架文档,f5云服务器
- forget password of WEBLOGIC user
- yield的用法详解
- 使用 Blazor 开发内部后台(三):登录
- 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 新增日志模块
- PHP如何获取文件行数
- JavaScript学习(三十三)—事件对象常用的属性和方法
- postgres 连接数查看与设置
- 【读书笔记】深入浅出数据分析
- 一文带你了解JDK动态代理的原理
- 宽带波束形成 matlab,关于均匀圆阵MVDR宽带波束形成的程序
- Spring Interceptor vs Filter 拦截器和过滤器区别
- Oracle安装之后电脑变慢
- swagger 的介绍和基本使用
- 搞定 conda 安装包报错问题
- 使用Zeppelin时出现sh interpreter not found错误的解决办法(图文详解)
- FF新推荐弹窗怎么彻底让他爬
- vue-cli的各个配置文件的详细介绍
- W10 无法启动你的相机
热门文章
- #for循环嵌套分析
- 研发人员如何做好管理
- tc260大数据安全标准化工作研究成果 学习笔记
- BOM引导——浏览器屏蔽弹出窗口的办法以及检查是否屏蔽的方法。
- 一加3t氢android8_一加3升级安卓8.0更新一览 一加3t安卓8.0有什么新功能
- 西雅图不相信爱情,66岁比尔盖茨离婚!财产分割成焦点
- 论文解读-Feature Selective Anchor-Free Module for Single-Shot Object Detection
- halcon 纹理检测_木板纹理识别 基于Halcon进行图像算法处理 - 下载 - 搜珍网
- 北京小厂Java实习面经
- java随机组卷和手动组卷功能实现