Python常用模块

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:\Learning\python>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:\Users\Administrator.USER-20190512NQ\Desktop\sed.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:\Learning\python>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:\Learning\python>pip uninstall cryptography
……
  Successfully uninstalled cryptography-2.7
(yunwei) E:\Learning\python>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:\Learning\python\sh.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:\Learning\python

 

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:\Learning\python\test\test

 

4> rmdir:删除单级空目录或空文件

os.rmdir('test')

result:

 

5> listdir:列出指定文件夹下面所有的文件夹和文件包括隐藏文件,以列表方式打印出来

print(os.listdir('E:\Learning\python'))

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:\Learning\python ��Ŀ 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'\root\etc'
FILE = 'little_zxj'
new_path = os.path.join(BASE_DIR,FILE)
print(new_path)

result:
\root\etc\little_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不正常

 

posted @ 2019-06-10 10:42  Ajunyu  阅读(675)  评论(0编辑  收藏  举报