[TOC]
模块
Module
预先写好的代码,供其他代码使用。
一个module是一个独立文件。
每个module拥有自己的全局变量空间。数据定义,函数,均定义在其中。
%%writefile testmod.py |
Writing testmod.py
!ls -l testmod.py |
-rw-r—r— 1 shell shell 111 9月 6 13:03 testmod.py
import
import引入某个module对象,可使用module.name的方式引用它的全局变量。
import testmod |
1
from import
from import引入模块中的某个(或全部)变量。
被引入变量不需要module.name来访问,仅需要name。
注意:不推荐引入全部变量,会引起名称空间污染。
from testmod import varible2 |
2
dir
列出某个模块的所有变量。import testmod
dir(testmod)
[‘builtins‘,
‘doc‘,
‘file‘,
‘name‘,
‘package‘,
‘add’,
‘varible1’,
‘varible2’]
模块预编译
当import时,python会试图去编译出pyc文件来。
pyc是被编译过的py文件,加载pyc文件可以跳过语法解析过程。
当py日期新于pyc时,重新生成pyc。所以日期紊乱可能导致执行老代码。
在Python3(3.2以后)中,会在当前目录下生成pycache目录,来缓存pyc文件。
这样可以避免多个Python解释器无法互相载入对方的pyc文件。
具体可以参考这里: https://docs.python.org/3/whatsnew/3.2.html
name属性
模块有一个属性,name。当这个属性为’main‘时,说明当前模块被作为脚本运行。
模块被作为以脚本运行时,不生成pyc文件(因为不是import)。
[root@workstation0 ~]# vim /root/pythondir/a.py |
package
到目前为止,你一定已经开始看到了组织你的程序的层次。变量通常在函数内部
运行。函数和全局变量通常在模块内部运行。如果你想自己组织模块呢?那” 包” 就
会进入到你的视野中。
包是模块的文件夹,有一个特殊的 init.py 文件,用来表明这个文件夹是特殊
的因为其包含有 Python 模块。
加入你想创建一个叫做’world’ 的包,有子包’asia’,’africa’ 等等,并且,这些子包
又包含模块,如’india’,’madagascar’ 等等。
- 从组织结构上说,package是比modules更大一级的结构。
- 一个package里可以包含多个modules和packages。
课堂练习:创建一个pythondir包,其中包含了模块a和模块b
[root@workstation0 ~]# touch /root/pythondir/__init__.py |
练习
- 导入系统sys模块
- 列出sys模块中以s开头并且以e结尾的成员。
[root@workstation0 ~]# cat m2.py |
第三方软件安装
两套基本系统:
setuptools
pip
booboo:根据不同的需求,我们可能需要安装不同的第三方软件包(python模块)
setuptools
系统中必须安装了setuptools[root@workstation0 tmp]# yum list|grep setuptools
Repodata is over 2 weeks old. Install yum-cron? Or run: yum makecache fast
python-setuptools.noarch 0.9.8-4.el7 @anaconda/7.2
[root@workstation0 tmp]# rpm -q python-setuptools
python-setuptools-0.9.8-4.el7.noarch
[root@workstation0 tmp]# rpm -qi python-setuptools
Name : python-setuptools
Version : 0.9.8
Release : 4.el7
Architecture: noarch
Install Date: Wed 04 May 2016 02:39:11 AM CST
Group : Applications/System
Size : 2041356
License : Python or ZPLv2.0
Signature : RSA/SHA256, Fri 07 Aug 2015 02:30:06 PM CST, Key ID 199e2f91fd431d51
Source RPM : python-setuptools-0.9.8-4.el7.src.rpm
Build Date : Tue 30 Jun 2015 06:44:38 PM CST
Build Host : x86-024.build.eng.bos.redhat.com
Relocations : (not relocatable)
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Vendor : Red Hat, Inc.
URL : http://pypi.python.org/pypi/setuptools
Summary : Easily build and distribute Python packages
Description :
Setuptools is a collection of enhancements to the Python distutils that allow
you to more easily build and distribute Python packages, especially ones that
have dependencies on other packages.
This package contains the runtime components of setuptools, necessary to
execute the software that requires pkg_resources.py.
This package contains the distribute fork of setuptools.
[root@workstation0 tmp]# rpm -ql python-setuptools
/usr/bin/easy_install
/usr/bin/easy_install-2.7
...
/usr/share/doc/python-setuptools-0.9.8/docs/python3.txt
/usr/share/doc/python-setuptools-0.9.8/docs/roadmap.txt
/usr/share/doc/python-setuptools-0.9.8/docs/setuptools.txt
/usr/share/doc/python-setuptools-0.9.8/docs/using.txt
/usr/share/doc/python-setuptools-0.9.8/psfl.txt
/usr/share/doc/python-setuptools-0.9.8/zpl.txt
setuptools的使用
easy_install 包名
easy_install 安装包路径。(路径可以填写一个url,系统会从网络上下载安装)
在软件的分发包中找到setup.py,直接运行python setup.py install
进一步资料请参考:https://setuptools.readthedocs.io/en/latest/easy_install.html
[root@workstation0 tmp]# easy_install --help |
pip
系统中必须有pip,具体请咨询管理员。或者下载该文件:
https://bootstrap.pypa.io/get-pip.py
使用python执行安装(注意需要管理员权限)。
pip的使用
pip install 包名
pip install -r requirements.txt (自动处理里面的所有依赖)
virtualenv
功能:用于隔离出一套独立的环境,可以在里面安装各种包,而不对系统造成影响。
使用场景:可以在用户目录中安装包,无需系统权限。也可以隔离多个环境,安装不同版本的不同程序。
限制:virtualenv本身,及其依赖的Python是无法隔离的。
[root@workstation0 tmp]# yum list|grep virtualenv |
virtualenv的使用
建立环境:virtualenv 目录名
激活环境:进入目录后执行source bin/activate
退出激活环境:deactivate
隔离环境内的安装:pip或者setup.py均可
注意:安装库时需要编译的,系统中必须有编译工具链。
[root@workstation0 ~]# mkdir booboo |
访问系统库
如果在使用virtualenv的同时,也想使用系统中安装的库。那么需要在创建环境时用—system-site-packages参数。
从工程管理角度,我们不推荐这种办法。建议将系统中的所有库在虚环境中再安装一次。
虚拟环境的发布
使用virtualenv生成的虚拟环境可以迁移到其他机器上,从而允许将运行环境在多台机器上迁移。但是需要注意以下事项:
- virtualenv依赖于目录工作,所以所有机器上virtualenv必须处于同一路径下。
- virtualenv不能隔离系统/Python基础环境。因此所有机器必须同构,并且Python环境基本一致。
- 里面所安装的库所依赖的其他系统文件,例如动态运行库,数据文件。如果不在virtualenv里安装的,则每个系统上均需要自行安装。
更进一步资料
请参考这里:
https://virtualenv.pypa.io/en/stable/userguide/
软件包安装和管理建议
Python默认情况下会试图将软件包安装到系统里,如果不具备管理员权限,需要使用virtualenv来安装软件包。
对于Debian/Ubuntu而言,安装软件的第一选择是apt系统。如果找不到包,或版本不对,建议采用virtualenv + pip的方式安装。
对于RHEL/CentOS而言,安装软件的第一选择是yum系统。如果找不到包,或版本不对,建议采用virtualenv + pip的方式安装。
对于Windows/MacOS而言,建议使用virtualenv + pip的方式安装。
python实例-psutil系统基础信息模块详解
Python实践1——virtualenv的使用
建立环境:virtualenv 目录名
激活环境:进入目录后执行source bin/activate
退出激活环境:deactivate
隔离环境内的安装:pip或者setup.py均可
注意:安装库时需要编译的,系统中必须有编译工具链。
[root@workstation0 ~]# yum list|grep python-vir |
Python实践2——virtualenv中安装psutil系统性能信息模块
psutil是一个跨平台库(https://pypi.python.org/packages),能够轻
松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网
络等)信息。它主要应用于系统监控,分析和限制系统资源及进程的管
理。它实现了同等命令行工具提供的功能,如ps、top、lsof、netstat、
ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、
pidof、tty、taskset、pmap等。
第一次尝试安装时,报错说缺少gcc |
可以看到离开虚拟环境,python无法加载psutil模块[kiosk@foundation0 Desktop]$ ssh root@172.25.0.15
root@172.25.0.15's password:
X11 forwarding request failed on channel 0
Last login: Tue Oct 18 16:55:43 2016 from 172.25.0.250
[root@workstation0 ~]# python
Python 2.7.5 (default, Oct 11 2015, 17:47:16)
[GCC 4.8.3 20140911 (Red Hat 4.8.3-9)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>> import psutil
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named psutil
>>
Python实践3——使用psutil系统性能信息模块获取当前物理内存总大小及已使用大小
[root@workstation0 ~]# free -h |
>> import psutil |
我们可以通过help(psutil)来查看帮助信息;进入帮助之后可以使用“/关键字”搜索关键字;使用q退出>> help(psutil)
virtual_memory
total 虚拟内存的总大小
used 虚拟内存已经使用的大小
内存信息
Linux系统的内存利用率信息:
涉及total(内存总数)
used(已使用的内存数)
free(空闲内存数)
buffers(缓冲使用数)
cache(缓存使用数)
swap(交换分区使用数)
psutil.virtual_memory()与psutil.swap_memory()方法获取这些信息
Python实践4——使用psutil系统性能信息模块获取当前系统CPU利用率
>> import psutil |
CPU信息
Linux操作系统的CPU利用率有以下几个部分:
- User Time,执行用户进程的时间百分比;
- System Time,执行内核进程和中断的时间百分比;
- Wait IO,由于IO等待而使CPU处于idle(空闲)状态的时间百分比;
- Idle,CPU处于idle状态的时间百分比。
psutil.cpu_times()方法可以非常简单地得到这些信息
- cpu_times() 获取CPU完整信息
- cpu_times(percpu=True) 指定方法变量percpu=True显示所有逻辑CPU信息
- cpu_times().user 获取执行用户进程的时间百分比
- cpu_count(logical=True) 获取CPU的逻辑个数
- cpu_count(logical=False) 获取CPU的物理个数
Python实践5——使用psutil系统性能信息模块获取当前系统磁盘信息
>> import psutil |
磁盘IO信息
- read_count(读IO数)
- write_count(写IO数)
- read_bytes(IO读字节数)
- write_bytes(IO写字节数)
- read_time(磁盘读时间)
- write_time(磁盘写时间)等。
这些IO信息可以使用psutil.disk_io_counters()获取
- disk_partitions() 获取磁盘完整信息
- disk_usage() 获取分区(参数)的使用情况
- disk_io_counters() 获取硬盘总的IO个数、读写信息
- perdisk=True 参数获取单个分区IO个数读写信息
Python实践6——使用psutil系统性能信息模块获取当前系统网络信息
>> import psutil |
网络信息
- bytes_sent(发送字节数)
- bytes_recv=28220119(接收字节数)
- packets_sent=200978(发送数据包数)
- packets_recv=212672(接收数据包数)
这些网络信息使用psutil.net_io_counters()方法获取
- net_io_counters() 获取网络总的IO信息,默认pernic=False
- net_io_counters(pernic=True) 输出每个网络接口的IO信息
Python实践7——使用psutil系统性能信息模块获取当前系统用户登录信息
>> import subprocess |
其他系统信息
psutil模块还支持获取用户登录、开机时间等信息
- users()
- boot_time() 开机时间
Python实践8——使用psutil系统性能信息模块获取当前系统进程信息
>> import psutil |
系统进程管理方法
获得当前系统的进程信息,可以让运维人员得知应用程序的运行
状态,包括进程的启动时间、查看或设置CPU亲和度、内存使用率、IO
信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存
活、资源利用情况,为开发人员的代码优化、问题定位提供很好的数据
参考。
进程信息
psutil模块通过psutil.pids()方法获取所有进程PID;psutil.Process()方法获取单个进程的名称、路径、状态、系统资源利用率等信息。
- psutil.pids() #列出所有进程PID
- psutil.Process(2424) #实例化一个Process对象,参数为一进程PID
- p.name() #进程名
- p.exe() #进程bin路径
- p.cwd() #进程工作目录绝对路径
- p.status() #进程状态
- p.create_time() #进程创建时间,时间戳格式
- p.uids() #进程uid信息
- p.gids() #进程gid信息
- p.cpu_times() #进程CPU时间信息,包括user、system两个CPU时间
- p.cpu_affinity() #get进程CPU亲和度,如要设置进程CPU亲和度,将CPU号作为参数即可
- p.memory_percent() #进程内存利用率
- p.memory_info() #进程内存rss、vms信息
- p.io_counters() #进程IO信息,包括读写IO数及字节数
- p.connections() #返回打开进程socket的namedutples列表,包括fs、family、laddr等信息
- pl.num_threads() #进程开启的线程数
popen类的使用
>> import psutil |
psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态
- psutil.Popen([“/usr/bin/python”, “-c”, “print(‘hello’)”],stdout=PIPE) #通过psutil的Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息
- p.cpu_times() #得到进程运行的CPU时间
python实例-paramkio模块实现ssh管理
ssh
ssh允许你安全地连接到远程服务器,执行shell命令,传输文件,并在连接双方进行端口转发。
如果有一个命令地ssh工具,为什么还要通过编写脚本来使用ssh协议呢?
主要原因是这样做除了能够使用ssh协议地全部功能外,还能够使用python的全部功能。
ssh2协议就是通过paramkio的python模块实现的,通过python代码,可以连接到ssh服务器,并完成一些ssh任务。
实践1——安装paramkio包
- 从共享中下载paramkio和PyCrypto
- 依赖模块:PyCrypto - The Python Cryptography Toolkit
- 依赖软件:python-dev
[root@foundation0 soft]# ls |
实践2——编写python脚本连接到ssh服务器并远程执行命令
密码方式登录
#!/usr/bin/env python |
基于证书方式的登录
|
python 脚本实战
for循环9*9
自定义模块,加载模式,使用模块的方法,数据(name)
使用subprocess模块完成病毒自我复制
使用subprocess模块完成批量添加用户
虚拟环境的搭建,激活和退出;第三方包的安装
病毒:(bash、python)
- 判断当前病毒是否已经在运行,如果是,那么我就不再运行
- 病毒感染对象为bash|python脚本(file )(Python script|Bourne-Again shell script)
- 可执行的可写的[ -w file -a -x file ]
- 感染病毒的脚本执行的时候会额外输出”I am evil!”
- 病毒能够自我复制
- 如果已经被感染,就不再感染
!/bin/bash |
#!/usr/bin/env python |
课堂练习:
- 采集班级所有同学的姓名和学号,放在字典中,例如{0:’大宝’,1:’佩琦’}
- 全班同学玩杀人游戏,现在需要角色分配,如果学生的总数为3n+1个,则n为平民、杀手、警察的数量,法官只有1个;
如果学生的总数不是3n+1,而是3n+2或者3n+3,则将多余人加到平民中,例如3n+2,则平民的个数n+1,若为3n+3,则平民的个数n+2
以上需求请用python脚本完成,随机分配角色。
0 大宝 |
#!/usr/bin/env python |
实践paramiko——编写python脚本连接到ssh服务器并远程执行命令_密码方式登录
#!/usr/bin/env python |
课堂实践:要求写python脚本完成mastera、masterb、slavea、slaveb四台服务器的vim软件的安装。
#!/usr/bin/env python |