网站群建设,最近在线观看免费完整版高清电影,wordpress训网 插件,专门帮忙做网站的公司一、模块
1、模块的定义#xff1a;
为了编写可维护的代码#xff0c;我们把很多函数分组#xff0c;分别放到不同的文件里#xff0c;这样#xff0c;每个文件包含的代码就相对较少#xff0c;
很多编程语言都采用这种组织代码的方式。在Python中#xff0c;一个.py文件…一、模块
1、模块的定义
为了编写可维护的代码我们把很多函数分组分别放到不同的文件里这样每个文件包含的代码就相对较少
很多编程语言都采用这种组织代码的方式。在Python中一个.py文件就称之为一个模块Module。
2、使用模块的好处
1 提高了代码的可维护性其次可以被其他地方引用。
2 使用模块可以避免函数名和变量名冲突。
3、模块分类
分为三种
1 内置标准模块又称标准库执行help(modules)查看所有python自带模块列表。
2 第三方开源模块可通过pip install 模块名 联网安装。
3 自定义模块
4、模块调用的方法
import module
from module import xx
from module.xx.xx import xx as rename
from module.xx.xx import
注意模块一旦被调用就相当于执行了另一个py文件里的代码。
5、自定义模块
所谓自定义模块就是创建了一个.py文件就可以称之为模块可以在另一个程序里导入。
6、模块查找路径
自定义模块只能在当前路径下的程序里才能导入换一个目录再导入自己的模块就报错说找不到了 这是为什么
这与导入路径有关
import sys
print(sys.path)
输出:[, /Library/Frameworks/Python.framework/Versions/3.6/lib/python36.zip,/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6,
/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/lib-dynload,/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages]
python解释器会按照列表顺序去依次到每个目录下去匹配你要导入的模块名只要在一个目录下匹配到了该模块名就立刻导入不再继续往后找。
注意列表第一个元素为空即代表当前目录所以你自己定义的模块在当前目录会被优先导入。
7、开源模块安装与使用
https://pypi.python.org/pypi 是python的开源模块库如何从这个平台上下载代码呢
1.直接在上面这个页面上点download,下载后解压并进入目录执行以下命令完成安装
编译源码 python setup.py build安装源码 python setup.py install
2、直接通过pip安装pip3 install paramiko #parmiko 是模块名
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是模块名
二、包package
└── my_proj
├── crm #代码目录
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ └── views.py
├── manage.py
└── my_proj #配置文件目录
├── settings.py
├── urls.py
像上面这样一个文件夹管理多个模块文件这个文件夹就被称为包。
crm/views.py内容
def sayhi():
print(hello world!)
通过manage.py调用
from crm import views
views.sayhi()
执行manage.pypthon3中可以执行但python2会出问题。包就是文件夹但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__int__.py用于标识当前文件夹是一个包。
在crm目录下创建一个空文件__int__.py 再执行一次就可以了。
注意在python3里即使目录下没__int__.py文件也能创建成功猜应该是解释器优化所致但创建包还是要记得加上这个文件 。
跨模块导入
如何实现在crm/views.py里导入proj/settings.py模块呢
直接导入会报错找不到模块。
因为路径找不到proj/settings.py 相当于是crm/views.py的父亲(crm)的兄弟(proj)的儿子(settings.py)
settings.py算是views.py的表弟啦在views.py里只能导入同级别兄弟模块代码或者子级别包里的模块
根本不知道表弟表哥的存在。该怎么做呢
添加环境变量把父亲级的路径添加到sys.path中就可以了这样导入 就相当于从父亲级开始找模块了。
#crm/views.py中添加环境变量
importsys ,os
BASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印当前被执行的模块.py文件相对路径注意是相对路径
print(BASE_DIR)
sys.path.append(BASE_DIR)from proj importsettingsdefsayhi():print(hello world!)
注意此时在proj/settings.py写上import urls会有问题 因为现在的程序入口是views.py , 你在settings.py导入import urls,
其实相当于在crm目录找urls.py,而不是proj目录若想正常导入要改成如下
from proj import urls #proj这一层目录已经添加到sys.path里可以直接找到
print(in proj/settings.py)
三、绝对导入和相对导入
├── __init__.py
├── crm
│ ├──__init__.py
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ ├── views.py#from ..proj import settings
├── manage.py
└── proj
├──__init__.py
├── settings.py#from .import urls
├── urls.py
└── wsgi.py
#views.py里代码
from ..proj importsettingsdefsayhi():print(hello world!)print(settings.DATABASES)
这样执行会报错。
在涉及到相对导入时package所对应的文件夹必须正确的被python解释器视作package而不是普通文件夹。
否则由于不被视作package无法利用package之间的嵌套关系实现python中包的相对导入。
文件夹被python解释器视作package需要满足两个条件
文件夹中必须有__init__.py文件该文件可以为空但必须存在该文件。
不能作为顶层模块来执行该文件夹中的py文件即不能作为主函数的入口。
所以这个问题的解决办法就是既然你在views.py里执行了相对导入那就不要把views.py当作入口程序
可以通过上一级的manage.py调用views.py。
from .. import models会报错的原因是这句代码会把manage.py所在的这一层视作package,但实际上它不是
因为package不能是顶层入口代码若想不出错只能把manage.py往上再移一层。
#正确的代码目录结构如下
packages/├──__init__.py
├── manage.py#from my_proj.crm import views
└── my_proj
├── crm
│ ├── admin.py
│ ├── apps.py
│ ├── models.py
│ ├── tests.py
│ ├── views.py#from . import models; from ..proj import settings
└── proj
├──__init__.py
├── settings.py
├── urls.py
└── wsgi.py
再执行manage.py就不会报错了。