Python3导入自定义模块的三种方法详解


Posted in Python onApril 13, 2018

前话

最近跟着廖雪峰的教程学到 模块 这一节。关于如何自定义一个模块,如果大家不懂的话先来看看基本的介绍:

模块

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。

使用模块有什么好处?

最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。点这里查看Python的所有内置函数。

你也许还想到,如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。

类似的,可以有多级目录,组成多级层次的包结构。比如如下的目录结构:

mycompany
 ├─ web
 │  ├─ __init__.py
 │  ├─ utils.py
 │  └─ www.py
 ├─ __init__.py
 ├─ abc.py
 └─ xyz.py

文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utils和mycompany.web.utils。

自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys模块,自己的模块就不可命名为sys.py,否则将无法导入系统自带的sys模块。

mycompany.web也是一个模块,请指出该模块对应的.py文件。

小结

模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用。

创建自己的模块时,要注意:

  • 模块名要遵循Python变量命名规范,不要使用中文、特殊字符;
  • 模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。

模块是个好东西啊,大牛们开源共享许多模块也加快了大家开发的速度,许多开源模块可以在这里找到 ↓

https://pypi.python.org/pypi

因为刚入门所有有很多细节不懂,在网上搜寻资料的时候发现各位大神们的教程实在太过于精简,让我这个菜鸟很辛苦的才操作成功。

因此在这里记录下来。

开始

第一种,直接 import

这里有个大前提,就是你的py执行文件和模块同属于同个目录(父级目录),如下图:

Python3导入自定义模块的三种方法详解

  • main.py 和 pwcong模块同在python目录
  • 执行文件为main.py
  • pwcong文件夹为一个模块

我把pwcong模块提供的函数写在 __init__.py 里,里面只提供一个 hi 函数:

# pwcong 模块的 __init__.py
# -*- coding: utf-8 -*-
def hi():
 print("hi")

执行文件main.py直接import模块:

# main.py
# -*- coding: utf-8 -*-
import pwcong
pwcong.hi()

接着我们运行一下main.py可以看到命令行窗口输出了一句 hi ,第一种方式完成。

使用模块方式为:先导入-》接着输入模块.变量|函数, 如上面例子的 pwcong.hi()

第二种,通过sys模块导入自定义模块的path

如果执行文件和模块不在同一目录,这时候直接import是找不到自定义模块的。如下图:

Python3导入自定义模块的三种方法详解

  • 执行文件main.py在main目录下
  • pwcong模块在python目录下

sys模块是python内置的,因此我们导入自定义模块的步骤如下:

  1. 先导入sys模块
  2. 然后通过sys.path.append(path) 函数来导入自定义模块所在的目录
  3. 导入自定义模块。

这时候 main.py 这样写:

# main.py
# -*- coding: utf-8 -*-
import sys
sys.path.append(r"C:\Users\Pwcong\Desktop\python")
import pwcong
pwcong.hi()

最后执行main.py文件,最终输出 hi ,第二种方式完成。

第三种,通过pth文件找到自定义模块

这个方法原理就是利用了系统变量,python会扫描path变量的路径来导入模块,可以在系统path里面添加。但是我还是推荐使用pth文件添加。

模块和执行文件目录结构跟上图一样:

Python3导入自定义模块的三种方法详解

  • 执行文件main.py在main目录下
  • pwcong模块在python目录下

我们创建一个 module_pwcong.pth 文件,里面内容就是 pwcong模块所在的目录:

C:\Users\Pwcong\Desktop\python

将该 module_pwcong.pth 文件放到这里:

python安装目录\Python35\Lib\site-packages

例如我的:

Python3导入自定义模块的三种方法详解

然后 main.py 导入并使用自定义模块:

# -*- coding: utf-8 -*-
import pwcong
pwcong.hi()

最后执行 main.py 文件,可以输出 hi ,第三种方式完成。

结束

到这里三种导入自定义模块的方式栗子就完成了,我写的应该很详细了吧 :)

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python显示进度条的方法
Sep 20 Python
学习Python3 Dlib19.7进行人脸面部识别
Jan 24 Python
Python实现的大数据分析操作系统日志功能示例
Feb 11 Python
对python中的try、except、finally 执行顺序详解
Feb 18 Python
Python实现的爬取小说爬虫功能示例
Mar 30 Python
详解numpy的argmax的具体使用
May 27 Python
Python多进程入门、分布式进程数据共享实例详解
Jun 03 Python
python并发编程 Process对象的其他属性方法join方法详解
Aug 20 Python
Python3将jpg转为pdf文件的方法示例
Dec 13 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
PyCharm最新激活码PyCharm2020.2.3有效
Nov 18 Python
Python实现简单得递归下降Parser
May 02 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 #Python
DataFrame 将某列数据转为数组的方法
Apr 13 #Python
Python中将dataframe转换为字典的实例
Apr 13 #Python
Python 实现使用dict 创建二维数据、DataFrame
Apr 13 #Python
每天迁移MySQL历史数据到历史库Python脚本
Apr 13 #Python
python实现数据库跨服务器迁移
Apr 12 #Python
解决python3爬虫无法显示中文的问题
Apr 12 #Python
You might like
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
基于jQuery实现的水平和垂直居中的div窗口
2011/08/08 Javascript
js 数组操作之pop,push,unshift,splice,shift
2014/01/29 Javascript
Nodejs Post请求报socket hang up错误的解决办法
2014/09/25 NodeJs
JavaScript中的依赖注入详解
2015/03/18 Javascript
AngularJS 整理一些优化的小技巧
2016/08/18 Javascript
AngularJS使用自定义指令替代ng-repeat的方法
2016/09/17 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
AngularJS  ng-repeat遍历输出的用法
2017/06/19 Javascript
Vue 实现双向绑定的四种方法
2018/03/16 Javascript
Vue中"This dependency was not found"问题的解决方法
2018/06/19 Javascript
使用VUE+iView+.Net Core上传图片的方法示例
2019/01/04 Javascript
element实现合并单元格通用方法
2019/11/13 Javascript
如何基于JavaScript判断图片是否加载完成
2019/12/28 Javascript
js实现验证码功能
2020/07/24 Javascript
vue中实现弹出层动画效果的示例代码
2020/09/25 Javascript
Nuxt pages下不同的页面对应layout下的页面布局操作
2020/11/05 Javascript
[03:41]DOTA2上海特锦赛小组赛第三日recap精彩回顾
2016/02/28 DOTA
[51:28]EG vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/16 DOTA
使用Python脚本生成随机IP的简单方法
2015/07/30 Python
python print 按逗号或空格分隔的方法
2018/05/02 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
python 进程间数据共享multiProcess.Manger实现解析
2019/09/23 Python
使用 prometheus python 库编写自定义指标的方法(完整代码)
2020/06/29 Python
python实现经纬度采样的示例代码
2020/12/10 Python
奥地利顶级内衣丝袜品牌英国站:Wolford英国
2016/08/29 全球购物
StubHub希腊:购买体育赛事、音乐会和剧院门票
2019/08/03 全球购物
ManoMano英国:欧洲第一家专注于DIY和园艺市场的电商平台
2020/03/12 全球购物
养成教育经验材料
2014/05/26 职场文书
质量月口号
2014/06/20 职场文书
诉讼授权委托书
2014/10/15 职场文书
2014年汽车销售工作总结
2014/12/01 职场文书
2015年师德师风承诺书
2015/01/22 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
高中家长意见怎么写
2015/06/03 职场文书