1. 什么是模块?模块要怎么用?
模块的概念可以参考函数的概念,模块也是一个命令的集合,是一组功能的组合。模块是一个Python文件,以.py结尾,包含了Python的定义和声明。
引用模块可以直接使用import命令:import modules 或者 from modules import function。
在Python解释器中,同一环境下的py文件是可以当做文件导入的,因此在利用模块进行操作时文件名一般不与模块名相同,以免模块无法导入。
对于Python内置的模块可以直接导入,对于其他开源模块可以利用pip先下载再使用import命令导入。
由于博主还处在学习阶段,所以这篇博客先介绍一些最常用的模块,其他模块会在今后的学习过程中进行补充。
2. time模块
time.sleep(num) :沉睡时间
import time for i in range(11): if i % 2 == 0: print(i) i +=1 result: 0 2 4 6 8 10
2. psutil
psutil模块主要来监控系统资源,是一个开源模块,需要下载。
(yunwei) E:Learningpython>pip install psutil yagmail ……. Successfully installed psutil-5.6.2 yagmail-0.11.220 ….. import psutil #导入 mem = psutil.virtual_memory() #监控内存 print(mem) result: svmem(total=8496857088, available=3805626368, percent=55.2, used=4691230720, free=3805626368) #总共、可用、占用率(%)、已用、空闲,单位均为字节 cpu = psutil.cpu_percent(1) #一秒内CPU的占用率 print(cpu) result: 12.4 disk = psutil.disk_usage('c:') #查看C盘的使用情况 print(disk) result: sdiskusage(total=107374178304, used=25433534464, free=81940643840, percent=23.7)
以上各系统信息均以元组形式列出,可以通过[index]取出相应的值。利用函数实现时尽量一个动作一个函数,降低函数的耦合。
3. yagmail模块
yagmail模块主要用来发送邮件,属于内置模块。
#导入 import yagmail #连接邮箱服务器 # yag = yagmail.SMTP(user='你的邮箱@163.com', password='邮箱授权码', host='smtp.163.com') # 发送邮件 # yag.send(to=['邮箱地址@163.com','邮箱地址@163.com'],subject='这是测试邮件标题', contents=['这是测试邮件的内容',r'C:UsersAdministrator.USER-20190512NQDesktopsed.txt']) #多个收件人、附件 # 断开连接 # yag.close()
4. configparser模块
ConfigParser 是用来读取配置文件的包。配置文件的格式如:中括号“[ ]”内包含的为section。section 下面为类似于key-value 的配置内容。configparser为内置模块,导入即可使用。
#在同一环境下创建info.txt文件用作实验,文件内容: [little] server_id = 1 name = zxj age = 23 [zxj] #该文件包含这两个section内容。 #导入模块 import configparser #实例化对象 config = configparser.ConfigParser() config.read("info.txt", encoding="utf-8") #config.get:通过section下面的key获取value res = config.get('little','server_id') print(res) result: 1 #config.sections():获取所有的section节点名字 print(config.sections()) result: ['little', 'zxj'] #config.options:获取指定section下的所有的key print(config.options('little')) result: ['server_id', 'name', 'age'] #给指定的section节点写入key和value并保存,有则更新,无责创建 config.set('zxj','age','23') config.write(open('info.txt','w')) #要用w将文件内容写入 result:
#查看原文件: [little] server_id = 1 name = zxj age = 23 [zxj] age = 23 #config.has_section():判断是否有指定的节点 res = config.has_section('zxj') print(res) result: True #config,has_options:判断指定节点下是否有指定的key(option) res = config.has_option('zxj','age') print(res) result: True #config.add_section:添加section config.add_section('anjun') config.write(open('info.txt','w')) result:
#查看原文件: [little] server_id = 1 name = zxj age = 23 [zxj] age = 23 [anjun] #config.remove:删除section及其下的内容 config.remove_section("little") config.write(open('info.txt','w')) result:
#查看原文件: [zxj] age = 23 [anjun]
5. paramiko模块
paramiko可以模拟ssh模块远程连接linux主机,Python解释器可以通过paramiko模块用代码操控linux主机,实现不同终端的交互。通过paramiko模块可以实现linux的大部分命令。parami模块属于第三方开源模块,需要pip下载。
#下载安装paramiko模块 (yunwei) E:Learningpython>pip install paramiko …… Successfully installed bcrypt-3.1.6 paramiko-2.4.2 pyasn1-0.4.5 pynacl-1.3.0 #注意:paramiko 2.4.2依赖cryptography,而最新的cryptography有些弃用的API,使得paramiko模块不兼容,导致paramiko模块运行时会进行警告。卸载掉cryptography高版本,安装cryptography低版本就可以了。 (yunwei) E:Learningpython>pip uninstall cryptography …… Successfully uninstalled cryptography-2.7 (yunwei) E:Learningpython>pip install cryptography==2.4 Successfully installed cryptography-2.4 idna-2.8
1> 打开linux主机,用paramiko模块实现交互式连接
#主机:192.168.16.4 #导入模块 import paramiko #实例化对象 ssh = paramiko.SSHClient() #定义规则,自动添加规则 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) #连接主机 ssh.connect(hostname='192.168.16.4',port=22,username='root',password='zxjwrl') #执行命令,其返回值有三种情况:标准输入、标准输出、标准错误,返回值顺序不变,变量名可以自定义。 stdin,stdout,stderr = ssh.exec_command('ls -ltr') #执行ls -ltr命令 #打印标准输出结果 print(stdout.read().decode('utf-8')) #将byte转码 result: total 5896 -rw-r--r--. 1 root root 4051204 Jun 7 2018 STXINWEI.TTF -rw-r--r--. 1 root root 1947721 Oct 18 2018 redis-5.0.0.tar.gz -rw-------. 1 root root 1263 Apr 15 22:21 anaconda-ks.cfg -rw-r--r--. 1 root root 0 May 9 03:59 zxj.txt -rw-r--r--. 1 root root 380 May 9 16:56 example.yaml -rw-r--r--. 1 root root 13 May 9 19:25 example.retry drwxr-xr-x. 3 root root 35 May 10 03:14 playbooks -rw-r--r--. 1 root root 96 May 22 15:23 appendonly.aof -rw-r--r--. 1 root root 210 May 22 15:32 dump.rdb drwxr-xr-x. 2 root root 4096 May 22 20:03 conf -rw-r--r--. 1 root root 225 May 23 16:45 create_user.sh -rw-r--r--. 1 root root 175 May 23 16:45 count1 #可以将paramiko模块整合成死循环,当成xshell来使用。paramiko模块不支持动态命令、cd命令等。 import paramiko while True: ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(hostname='192.168.16.4',port=22,username='root',password='zxjwrl') cmd = input('Please input command:') stdin,stdout,stderr = ssh.exec_command(cmd) print(stdout.read().decode('utf-8')) result: Please input command:ls -l total 5896 -rw-------. 1 root root 1263 Apr 15 22:21 anaconda-ks.cfg -rw-r--r--. 1 root root 96 May 22 15:23 appendonly.aof drwxr-xr-x. 2 root root 4096 May 22 20:03 conf -rw-r--r--. 1 root root 175 May 23 16:45 count1 -rw-r--r--. 1 root root 225 May 23 16:45 create_user.sh -rw-r--r--. 1 root root 210 May 22 15:32 dump.rdb -rw-r--r--. 1 root root 13 May 9 19:25 example.retry -rw-r--r--. 1 root root 380 May 9 16:56 example.yaml drwxr-xr-x. 3 root root 35 May 10 03:14 playbooks -rw-r--r--. 1 root root 1947721 Oct 18 2018 redis-5.0.0.tar.gz -rw-r--r--. 1 root root 4051204 Jun 7 2018 STXINWEI.TTF -rw-r--r--. 1 root root 0 May 9 03:59 zxj.txt Please input command:df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/cl-root 17G 3.0G 15G 18% / devtmpfs 478M 0 478M 0% /dev tmpfs 489M 0 489M 0% /dev/shm tmpfs 489M 6.8M 482M 2% /run tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda1 1014M 139M 876M 14% /boot tmpfs 98M 0 98M 0% /run/user/0
Please input command:cd Please input command:ll Please input command: ………..
2> 通过paramiko模块连接主机进行上传和下载
上传: #实例化对象 import paramiko t = paramiko.Transport(('192.168.16.4',22)) #元组类型 #连接 t.connect(username='root',password='zxjwrl') #实例化ftp对象 sftp = paramiko.SFTPClient.from_transport(t) #上传文件 sftp.put('info.txt','/root/infor.txt') #本地文件,远程地址;若不在同一环境下写绝对路径;远程路径下必须有文件名,支持文件重名命名 #关闭 sftp.close() result: #在主机192.168.16.4下查看
下载:将put换成get t = paramiko.Transport(('192.168.16.4',22)) t.connect(username='root',password='zxjwrl') sftp = paramiko.SFTPClient.from_transport(t) sftp.get('/root/create_user.sh','E:Learningpythonsh.sh') sftp.close() result:
3> 实例:利用paramik模块配置lvs
import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) def direct_server(): ssh.connect('192.168.254.17', 22, 'root', 'root',timeout=3) stdin, stdout, stderr = ssh.exec_command('ipvsadm -C;' 'ipvsadm -A -t 192.168.254.250:80 -s wrr;' 'ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.37:80 -w 1 -g;' 'ipvsadm -a -t 192.168.254.250:80 -r 192.168.254.19:80 -w 2 -g;' 'ifconfig ens33:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up;' 'route add -host 192.168.254.250 dev ens33:0') print(stderr.read().decode('utf-8')) print(stdout.read().decode('utf-8')) print('dicret_server配置完成!!!') def real_server1(): ssh.connect('192.168.254.37', 22, 'root', 'root', timeout=3) stdin, stdout, stderr = ssh.exec_command('ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up;' 'route add -host 192.168.254.250 dev lo:0;' 'echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore;' 'echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce;' 'echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore;' 'echo "2">/proc/sys/net/ipv4/conf/all/arp_announce;' 'service httpd restart') print(stderr.read().decode('utf-8')) print(stdout.read().decode('utf-8')) print('real_server1配置完成!!!') def real_server2(): ssh.connect('192.168.254.19', 22, 'root', 'root', timeout=3) stdin, stdout, stderr = ssh.exec_command( 'ifconfig lo:0 192.168.254.250 broadcast 192.168.254.250 netmask 255.255.255.255 up;' 'route add -host 192.168.254.250 dev lo:0;' 'echo "1">/proc/sys/net/ipv4/conf/lo/arp_ignore;' 'echo "2">/proc/sys/net/ipv4/conf/lo/arp_announce;' 'echo "1">/proc/sys/net/ipv4/conf/all/arp_ignore;' 'echo "2">/proc/sys/net/ipv4/conf/all/arp_announce;' 'service httpd restart') print(stderr.read().decode('utf-8')) print(stdout.read().decode('utf-8')) print('real_server2配置完成!!!') def main(): direct_server() real_server1() real_server2() ssh.close() if __name__ == '__main__': main()
6. os模块
os模块主要是模拟操作系统,跟操作系统本主机交互。os模块是内置的模块,导入即可。
import os
1> getcwd:获取当前工作路径
print(os.getcwd())
result:
E:Learningpython
2> chdir:改变当前工作路径
print(os.getcwd()) os.chdir('..') #退回一层路径 print(os.getcwd())
3> makedirse:创建级联目录;mkdir:只能创建一层目录。
os.makedirs('test/test') #创建级联目录 os.chdir('test/test') #改变路径至此目录下 print(os.getcwd()) #查看当前工作目录 result: E:Learningpython est est
4> rmdir:删除单级空目录或空文件
os.rmdir('test') result:
5> listdir:列出指定文件夹下面所有的文件夹和文件包括隐藏文件,以列表方式打印出来
print(os.listdir('E:Learningpython')) result: ['.idea', 'build', 'dist', 'info.txt', 'lanaguage.py', 'monit_sys.py', …….]
6>remove:删除指定的文件
os.remove('monit_sys.spec')
7> rename:重命名
#将language.py重命名为experment.py os.rename('lanaguage.py','experment.py')
8> stat:查看问价详细信息
print(os.stat('info.txt')) result: os.stat_result(st_mode=33206, st_ino=3940649673961606, st_dev=2902308876, st_nlink=1, st_uid=0, st_gid=0, st_size=30, st_atime=1559718603, st_mtime=1559638202, st_ctime=1559635820)
9> path.exists:判断文件或目录是否存在,返回布尔值。
res = os.path.exists('sh.sh') print(res) result: True
path.isfile:判断文件是否存在;
path.isdir:判断目录是否存在。
10> system:运行终端命令;会有返回值,0表示执行成功,非0表示执行失败。
#运行windows的终端命令(有乱码): os.system('dir') #文件目录
result: ������ E �еľ��� Data ������к��� ACFD-B80C E:Learningpython ��Ŀ 2019/06/05 16:05 <DIR> . 2019/06/05 16:05 <DIR> .. 2019/06/05 16:00 <DIR> .idea 2019/06/03 19:49 <DIR> build 2019/06/03 19:50 <DIR> dist 2019/06/05 16:05 4,057 experment.py 2019/06/04 16:50 30 info.txt 2019/06/03 21:20 2,661 monit_sys.py 2019/06/05 15:15 225 sh.sh 2019/06/03 16:37 168 speech.py 2019/06/04 09:42 1,861 test.py 2019/05/27 19:06 <DIR> USER 2019/06/02 10:24 738 usertest.py 2019/06/01 19:01 <DIR> venv 2019/06/03 19:50 <DIR> __pycache__ 2019/06/04 15:11 312 ����ը��.py 8 ���ļ� 10,052 �ֽ� 8 ��Ŀ¼ 102,809,473,024 �����ֽ� os.system('tasklist') #windows查看任务管理器 ӳ������ PID �Ự�� �Ự# �ڴ�ʹ�� ========================= ======== ================ =========== ============ System Idle Process 0 Services 0 8 K System 4 Services 0 64 K Registry 96 Services 0 99,776 K smss.exe 360 Services 0 1,080 K ……………………. res = os.system('tasklist > info.txt') #文件内容重定向到info.txt print(res) #打印执行码 result: 0
11> path.join:拼接完整路径。
BASE_DIR = r' ootetc' FILE = 'little_zxj' new_path = os.path.join(BASE_DIR,FILE) print(new_path) result: ootetclittle_zxj
new_path = os.path.join('[1,2,3]','[4,5,6]') print(new_path) result: [1,2,3][4,5,6]
7. pymysql模块
pymysql模块用来操作数据库,属于第三方模块,需要下载。
#安装pymysq模块 pip install pymysql …. Successfully installed pymysql-0.9.3 …. #打开安装好MariaDB数据库的终端192.168.16. 4,启动数据库,实例化参数 [root@localhost ~]# systemctl restart mariadb [root@localhost ~]# ss -tnl LISTEN 0 80 :::3306 :::* #导入pymysql模块,连接数据库 import pymysql db = pymysql.connect(host = '192.168.16.4', user = 'root' , password = '123', db = 'mysql', port =3306 ) #使用cursor()方法获取操作游标 cur = db.cursor() #实例化cur后利用该游标执行sql语句 sql = 'select host,user,password from user' #编写sql语句 cur.execute(sql) #执行sql语句 #获取执行(该处为查询)后的结果,以元组的形式列出 results = cur.fetchall() print(results) #关闭连接 db.close() #此时执行结果会进行报错,因为testdb并不允许第三方登录,所以给testdb授予权限。 MariaDB [mysql]> grant all privileges on *.* to root@'%' identified by'123'; Query OK, 0 rows affected (0.001 sec) #查看执行结果:元组信息 (('localhost', 'root', '*23AE809DDACAF96AF………
#可以用for循环将元组元素取出 … cur.execute(sql) results = cur.fetchall() for i in results: print(i) db.close() result: ('localhost', 'root', '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257') ('localhost.localdomain', 'root', '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257') ('127.0.0.1', 'root', '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257') ('::1', 'root', '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257') ('localhost', 'zabbix', '*DEEF4D7D88CD046ECA02A80393B7780A63E7E789') ('%', 'root', '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257') #利用gevent模块创建数据库testdb #终端查看 MariaDB [(none)]> show databases; +---------------------------+ | Database | +--------------------------+ | information_schema | | mysql | | performance_schema | | zabbix | +---------------------------+ #Python创建数据库 import pymysql db = pymysql.connect(host = '192.168.16.4', user = 'root' , password = '123', db = 'mysql', port =3306 ) cur = db.cursor() sql = 'create database testdb character set utf8;' cur.execute(sql) results = cur.fetchall() for i in results: print(i) db.close() result: #终端查看 MariaDB [mysql]> show databases; +--------------------------+ | Database | +--------------------------+ | information_schema | | mysql | | performance_schema | | testdb | | zabbix | +--------------------------+ #利用python=向新建的数据库testdb里面插入10000条数据 #终端操作 MariaDB [testdb]> create table students (id int primary key auto_increment, name varchar(20)); #新建表 MariaDB [testdb]> select * from students; Empty set (0.000 sec) #空表 #插入数据 import pymysql db = pymysql.connect(host = '192.168.16.4', user = 'root' , password = '123', db = 'testdb', port =3306 ) cur = db.cursor() for i in range(10000): cur.execute('insert into students values (0,"name-%s")' %i) db.commit() #提交事务 db.close() 运行: #终端查看 MariaDB [testdb]> select * from students; ……. 9991 | name-9990 | | 9992 | name-9991 | | 9993 | name-9992 | | 9994 | name-9993 | | 9995 | name-9994 | | 9996 | name-9995 | | 9997 | name-9996 | | 9998 | name-9997 | | 9999 | name-9998 | | 10000 | name-9999 | +-------+-----------+ 10000 rows in set (0.006 sec)
8. socket模块
socket(套接字)模块是一个内置模块,主要通过ip和端口来执行主机间的通信。
#导入socket模块 import socket #实例化参数 server = socket.socket() #默认tcp协议 #查看22端口
res = server.connect_ex(('192.168.16.4',22)) print(res) result: 0 #0表示执行成功,22端口是空的,非0表示没有执行成功 #利用socket模块监控多台主机的22端口是否正常工作: import socket hosts = ['192.168.16.3:22','192.168.16.4:22','192.168.16.5:22','192.168.16.6:2'] for host in hosts: server = socket.socket() server.settimeout(1) #自定义超时时间,默认为10s,可以缩短时间以提高效率。 ip = host.split(':')[0] #用split命令以: 进行分割得到ip port = host.split(':')[1] #用split命令以: 进行分割得到port res = server.connect_ex((ip,int(port))) if res == 0: print('%s正常' % ip) else: print('%s不正常' % ip) result: 192.168.16.3不正常 192.168.16.4正常 192.168.16.5不正常 192.168.16.6不正常