• 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: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不正常
  • 相关阅读:
    sql中触发器的使用
    sql中优化查询
    sql中case when语句的使用
    CSRF学习小结
    javascript正则表达式笔记
    elementUI单选框获取值
    elementUI内置过渡(折叠)
    elementUI内置缩放过渡(缩放)
    elementUi内置过渡动画(淡入)
    创建koa2项目
  • 原文地址:https://www.cnblogs.com/ajunyu/p/10976057.html
Copyright © 2020-2023  润新知