之前我们解决问题的时候,遇到复杂的问题,可能会导入python 的工具箱,这就是python里面自带的内置模块,其实python工具箱有好几百个,可以通过help('moudles')查看,得到的是python自带的和再第三方工具箱下载的,但是比如另一个人编写的模块我拿过来也能用,但是help('moudles')就不会显示出来。补充:查看的时候不用管下划线的部分,
使用模块有什么好处?
- 最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
- 可重用。
- 使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以,我们自己在编写模块时,不必考虑名字会与其他模块冲突
模块分类
模块分为三种:
- 内置标准模块(又称标准库,安装好python的时候自带的一个模块)执行help('modules')查看所有python自带模块列表
- 第三方开源模块,可通过pip install 模块名 联网安装
- 自定义模块
不管上面那种模块,调用都用import
模块调用
import module from module import xx from module.xx.xx import xx as rename from module.xx.xx import *
#不推荐使用,带*意思是全部
例子:
import random
from os import rmdir
#可以理解成,os是工具箱里的一个小工具箱,rmdir是os里的一个更小的工具箱,可以导入一个,也可以导入多个
#from os import rmdir, rename
from django.core import handles
#解释为,django是创建的一个目录,core是django下的子目录,handles是core下的子目录,而handles里的文件才是py文件
import multiprocessing #这个模块名较长,可以用as rename
import multiprocessing as mul #直接调用mul就行,和上面的效果是一样的
*注意:模块一旦被调用,即相当于执行了另外一个py文件里的代码
自定义模块
首先创建一个文件夹,并创建一个py文件,即模块
再交互器下导入模块
模块查找路径
并没有找到这个模块,这是因为路径的问题,python要找模块的时候,有一个范围,就是sys.path, 交互器上输入命令就会出现一个包括他范围的列表
其中,第一个 ' ' 是当前目录,回默认从当前目录找,如果有就不找了,如果没有就继续往后走,找完都没有就会报错,
第二个zip一行是python安装包的内容,第三个lib一行是python下放c语言库的东西,其实前几个我们几乎用不到,都是python自带的,因为python使用c写的,他们互相之间有一些调用关系。
而最后一行,site-packages是所有的标准库,包括第三方的和内置的都会放在这个文件
上面这些都是python默认的,自己也可以往进加东西,
也可以删除刚才加进去的,但是已经导入成功了,就不会重新导入,还是刚才的那个
要注意的是,加进去的只是再当前程序内的运行过程中有效,如果退出了,还是会没有
开源模块
https://pypi.python.org/pypi 是python的开源模块库,截止2017年9.30日 ,已经收录了118170个来自全世界python开发者贡献的模块,几乎涵盖了你想用python做的任何事情。 事实上每个python开发者,只要注册一个账号就可以往这个平台上传你自己的模块,这样全世界的开发者都可以容易的下载并使用你的模块。
那如何从这个平台上下载代码呢?
1.直接在上面这个页面上点download,下载后,解压并进入目录,执行以下命令完成安装
编译源码 python setup.py build
安装源码 python setup.py install
- 直接通过pip安装
pip3 install paramiko #paramiko 是模块名
pip命令会自动下载模块包并完成安装。
软件一般会被自动安装你python安装目录的这个子目录里
/your_python_install_path/3.6/lib/python3.6/site-packages
pip命令默认会连接在国外的python官方服务器下载,速度比较慢,你还可以使用国内的豆瓣源,数据会定期同步国外官网,速度快好多
sudo pip install -i http://pypi.douban.com/simple/ alex_sayhi --trusted-host pypi.douban.com #alex_sayhi是模块名
使用
下载后,直接导入使用就可以,跟自带的模块调用方法无差,演示一个连接linux执行命令的模块
#coding:utf-8 import paramiko ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect('192.168.1.108', 22, 'alex', '123') stdin, stdout, stderr = ssh.exec_command('df') print(stdout.read()) ssh.close(); 执行命令 - 通过用户名和密码连接服务器
包(Package)
当你的模块文件越来越多,就需要对模块文件进行划分,比如微信,假如有500个文件,就需要划分开,哪些是负责朋友圈的,哪些是支付功能的,再比如把负责跟数据库交互的都放一个文件夹,把与页面交互相关的放一个文件夹,
└── my_proj ├── crm #代码目录 │ ├── admin.py │ ├── apps.py │ ├── models.py │ ├── tests.py │ └── views.py ├── manage.py └── my_proj #配置文件目录 ├── settings.py ├── urls.py └── wsgi.py
像上面这样,一个文件夹管理多个模块文件,这个文件夹就被称为包
那不同包之间的模块互相导入呢?
crm/views.py内容
def sayhi(): print('hello world!')
通过manage.py调用
from crm import views views.sayhi()
包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。