Python作为一门脚本语言,胶带语言,自然是有它的胶带特点的,就例如Python和Linux系统的结合linux命令行启动,例如,在使用Python编撰手动化运维脚本的时侯,总免不了须要和Linux系统交互,如,查询Linux系统内的某个文件,之后更改这个文件并运行它(假定有可运行权限)。
Python让人称道的其中一个地方就是它的解释器十分齐全,这是真的不吹牛,只有你想不到,基本没有它没有的库,例如科学估算库numpy,pandas这种,或则与系统交互的库,os库,或则手动化测试的selenium库等等,究竟Python有多少库我想可能Python创始人也可能不晓得。(Python的社区太强悍了!!!!!)这么,假如Python须要调用Linux系统命令,例如,lslinux命令行启动,df,free,ps,这样的命令自然是须要与系统交互的专用库os结合了linux 软件,还一种方式就是直接操纵进程的啦,这么,自然就是subprocess库啦。也就是说,我们想要Python才能调用Linux系统命令,也就是Python与Linux系统交互,要么须要使用os库,要么须要使用subprocess库啦还有一个不太常用的commands库~~~!!!@~~~~
Python的os模块,见名之意linux学习视频,operasystem的意思是毫无疑惑了。该模块是Python的内建模块,也可以说是内建库了,该模块内的函数自然也是内建函数了,我们要和系统命令交互,须要使用它的system(),popen()这两个函数,或则使用commands模块,或则使用subprocess模块,上面两个函数和commands模块是比较陈旧的,现今官方比较推荐也可以说强烈推荐的是subprocess模块。
(1)os.system(系统层面的直接调用),这个调用相当直接,且是同步进行的,程序须要阻塞并等待返回。返回值是依赖于系统的,直接返回系统的调用返回值,所以windows和linux是不一样的。
仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息
(2)os.popen(新开线程形式),可以看出,popen方式通过p.read()获取终端输出,但是popen须要关掉close().当执行成功时,close()不返回任何值,失败时,close()返回系统返回值.可见它获取返回值的方法和os.system不同。
该方式不但执行命令还返回执行后的信息对象,用处在于:将返回的结果赋予一变量,以便程序的处理。
(3)使用模块commands(python3失效)
(4)使用模块subprocess(Python文档中目前竭力推荐),直接调用命令,返回值即是系统返回。shell=True表示命令最终在shell中运行。Python文档中出于安全考虑,不建议使用shell=True。
import os
import commands
print('=============================ls')
os.system('ls -al /')
print('===========df')
df = os.popen('df -ah').read()
print(df)
print('=========================free')
a = commands.getoutput("free -mh")
print(a)
输出结果为:
=============================ls
total 28
dr-xr-xr-x. 17 root root 244 Jan 24 12:11 .
dr-xr-xr-x. 17 root root 244 Jan 24 12:11 ..
-rw-r--r-- 1 root root 0 Jan 24 12:11 .autorelabel
lrwxrwxrwx. 1 root root 7 Jan 24 11:12 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Jan 24 12:11 boot
drwxr-xr-x 19 root root 3320 Feb 1 09:29 dev
drwxr-xr-x. 138 root root 8192 Feb 1 09:29 etc
drwxr-xr-x. 2 root root 6 Nov 5 2016 home
lrwxrwxrwx. 1 root root 7 Jan 24 11:12 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jan 24 11:12 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Nov 5 2016 media
drwxr-xr-x. 3 root root 19 Jan 24 11:34 mnt
drwxr-xr-x. 4 root root 34 Jan 24 11:58 opt
dr-xr-xr-x 229 root root 0 Feb 1 09:29 proc
dr-xr-x---. 11 root root 4096 Feb 1 09:30 root
drwxr-xr-x 39 root root 1200 Feb 1 09:29 run
lrwxrwxrwx. 1 root root 8 Jan 24 11:12 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 5 2016 srv
dr-xr-xr-x 13 root root 0 Feb 1 09:29 sys
drwxrwxrwt. 21 root root 4096 Feb 1 09:46 tmp
drwxr-xr-x. 13 root root 155 Jan 24 11:12 usr
drwxr-xr-x. 21 root root 4096 Jan 24 11:44 var
===========df
Filesystem Size Used Avail Use% Mounted on
rootfs - - - - /
sysfs 0 0 0 - /sys
proc 0 0 0 - /proc
devtmpfs 1.9G 0 1.9G 0% /dev
securityfs 0 0 0 - /sys/kernel/security
tmpfs 1.9G 0 1.9G 0% /dev/shm
devpts 0 0 0 - /dev/pts
tmpfs 1.9G 9.0M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
cgroup 0 0 0 - /sys/fs/cgroup/systemd
pstore 0 0 0 - /sys/fs/pstore
cgroup 0 0 0 - /sys/fs/cgroup/pids
cgroup 0 0 0 - /sys/fs/cgroup/cpu,cpuacct
cgroup 0 0 0 - /sys/fs/cgroup/net_cls,net_prio
cgroup 0 0 0 - /sys/fs/cgroup/perf_event
cgroup 0 0 0 - /sys/fs/cgroup/freezer
cgroup 0 0 0 - /sys/fs/cgroup/memory
cgroup 0 0 0 - /sys/fs/cgroup/cpuset
cgroup 0 0 0 - /sys/fs/cgroup/hugetlb
cgroup 0 0 0 - /sys/fs/cgroup/blkio
cgroup 0 0 0 - /sys/fs/cgroup/devices
configfs 0 0 0 - /sys/kernel/config
/dev/sda6 70G 4.7G 66G 7% /
systemd-1 - - - - /proc/sys/fs/binfmt_misc
debugfs 0 0 0 - /sys/kernel/debug
mqueue 0 0 0 - /dev/mqueue
hugetlbfs 0 0 0 - /dev/hugepages
nfsd 0 0 0 - /proc/fs/nfsd
/dev/sr0 4.3G 4.3G 0 100% /mnt/cdrom
/dev/sda3 5.0G 33M 5.0G 1% /home
/dev/sda2 20G 164M 20G 1% /var
/dev/sda1 497M 128M 370M 26% /boot
sunrpc 0 0 0 - /var/lib/nfs/rpc_pipefs
tmpfs 378M 4.0K 378M 1% /run/user/0
binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc
=========================free
total used free shared buff/cache available
Mem: 3.7G 939M 1.8G 8.9M 1.0G 2.5G
Swap: 4.0G 0B 4.0G
以上是os模块的system方式,popen方式和commands库调用Linux库的方式。后续补充subprocess的调用Linux系统命令的方式。(人在外边没Python环境)