Python模块及其导入
一、模块
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 viewsviews.sayhi()
执行manage.py,pthon3中可以执行,但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中添加环境变量 import sys ,osBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) #__file__的是打印当前被执行的模块.py文件相对路径,注意是相对路径 print(BASE_DIR)sys.path.append(BASE_DIR) from proj import settingsdef sayhi():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 import settings def sayhi():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就不会报错了。
注意:虽然python支持相对导入,但对模块间的路径关系要求比较严格,处理不当就容易出错, 不建议使用。
以上内容摘录与总结于:https://www.luffycity.com/python-book/di-4-zhang-python-ji-chu-2014-chang-yong-mo-kuai/mo-kuai-3001-bao-jie-shao-he-xiang-guan-yu-fa.html
转载于:https://www.cnblogs.com/schut/p/8436138.html
Python模块及其导入相关推荐
- Python培训教程分享:Python模块如何导入__all__属性?
本期小编为大家带来的Python培训教程是关于"Python模块如何导入__all__属性?"的内容,后面在工作中是会遇到Python模块这个工作内容的,Python模块的开头通常 ...
- python模块如何导入解释器_无法从嵌入式解释器导入内置模块(仅限Windows)
这个问题看起来可能是一个重复的问题 但我认为我的问题是不同的.我正在从一个MSVC编译的C++应用程序运行Python 3.4解释器,并且我尝试使用PTVSD模块来调试更容易.到目前为止,我已经能够连 ...
- 6.python模块(导入,内置,自定义,开源)
一.模块 1.模块简介 模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py.模块可以被别的程序引入,以使用该模块中的函数等功能.这也是使用python标准库的方法. 类似于函数式编程和面向过 ...
- python怎么导入包-python模块之导入包及模块发布
1.导入包(不常用的方法) 在使用python的包时,有时候想直接导入包名,然后通过包名来调用模块,例如: temp为我们创建的一个包,如果我们想通过下面的方式进行导入模块中的方法,将会出错 impo ...
- python怎么安装模块-Python模块及其导入
一.模块 1.模块的定义: 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少, 很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件 ...
- python模块的导入的两种方式区别详解
Python 有两种导入模块的方法.两种都有用,你应该知道什么时候使用哪一种方法.一种方法,import module,另一种是from module import,下面是 from module i ...
- python pychart三维_详解python模块pychartdir安装及导入问题
在迁移别人写好的脚本时,发现pychartdir没有导入,脚本执行报错.以下是报错内容: [modps@LGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/prod ...
- 如何获取本地安装的Python模块列表?
我想获得Python模块的列表,这些模块在我的Python安装(UNIX服务器)中. 如何获得计算机中安装的Python模块的列表? #1楼 使用pkgutil.iter_modules非常简单的搜索 ...
- python模块:运行机制与编写方法
文章目录 python模块的导入机制: python模块编写方法: #mod1: def printer(x):print(x) #mod2: print('hello') n=1 #mod3: x= ...
最新文章
- Java从零开始学四十五(Socket编程基础)
- linux下实现作业调度程序,Linux后台作业
- Spark 报错 : Error: bad symbolic reference. A signature in SparkContext.class refers to term conf
- 标签传播(阅读笔记)
- Qt error LNK2001: unresolved external symbol
- execl执行linux命令,Excel 调用Shell命令执行bash脚本和命令行代码
- 中级工程师基础SQL试题
- 三菱服务器显示rb是什么故障,​三菱伺服驱动器常见报警代码及解决办法
- Python每天一个小程序——字典翻转输出和《沉默的羔羊》之最多单词
- 如何画出一张优秀的架构图(老鸟必备)
- 数据清洗与处理第二章
- 2018年-读书笔记
- 云计算机手机apple,云电脑IOS版怎么在苹果IOS手机上使用教程
- 如何生成token,是使用token
- Redis之懒惰删除
- 微软今发免费安全软件套装 开放下载
- 37%,最佳停止观望点
- 使用Nginx在云服务器上搭建图床
- 小m序列的verilog实现
- MOOS-ivp中文手册参考
热门文章
- JS之连接数组方法concat
- 计算机win7内容已满,Win7旗舰版电脑C盘满了怎么清理
- python代码转换为pytorch_pytorch使用 to 进行类型转换方式
- Nginx基于域名的虚拟主机
- EditPlus软件自动补全文档htmlbar.acp设置 及 模板文件格式
- vscode设置中文,设置中文不成功问题
- 【集合框架】JDK1.8源码分析HashSet LinkedHashSet(八)
- 【转载】Linux中断处理学习笔记
- lower_case_table_names=1 启动报错 mysql8.0
- Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK