Python中的包ImportError
前言
Python中的包给我提供了很好的代码组织,相似的功能模块放在同一个包内,不仅代码结构清晰,而且调用起来也比较方便(可以用*导入)
但是,我们在刚开始使用Python包的时候总是会遇到导入错误"ImportError: No module named 'xxx'“,下面我们来简单介绍一下如何解决这类问题
Python中的包
Python中的包就和C#中的dll一样都是一些模块(或者类库)的集合。Python中新创建的包其实只有两个文件,一个是以包名命名的文件夹和其中的一个__init__.py文件(包的标识,可以到我之前的文章查看该文件的具体作用 http://www.cnblogs.com/AlwinXu/p/5598543.html )。既然了解了包的定义,那么我们如何引用包呢?在引用之前我们需要知道:
- 包是否为有效的包(用__init__.py标识)
- 包的路径在哪?是否添加到sys.path?
- 包中是否有要导入的模块
- 包的__init__.py中__all__是否包含要使用的模块(针对用from package import *导入的情况)
所以,当再次遇到导入错的时候,我们只需要检查以上四点,基本上能解决大部分的问题。
实例
首先我创建了包含两个包的工程,目录结构如下:
下面我们来看一下包导入的各种情况:
导入python自带包或外部包
Python自带包可以直接用import package或者from package import module来进行导入,以为自带包都存在于系统包路径中,可以通过sys.path来查看:
>>> import sys
>>> sys.path
['', '/Users/xualvin/anaconda/lib/python35.zip', '/Users/xualvin/anaconda/lib/python3.5',
'/Users/xualvin/anaconda/lib/python3.5/plat-darwin', '/Users/xualvin/anaconda/lib/python3.5/lib-dynload',
'/Users/xualvin/anaconda/lib/python3.5/site-packages',
'/Users/xualvin/anaconda/lib/python3.5/site-packages/Sphinx-1.3.5-py3.5.egg',
'/Users/xualvin/anaconda/lib/python3.5/site-packages/aeosa',
'/Users/xualvin/anaconda/lib/python3.5/site-packages/setuptools-20.3-py3.5.egg']
第三方python包路径需要添加到sys.path或者复制到已有sys.path中才可以正常导入。使用sys.path.append("path_to_third_party_packages")进行添加
导入本工程中的包
如在上图包结构中的RootMain.py中导入Pack1,Pack1.SubPack和Pack2中的模块:
from Pack1 import *
from Pack1.SubPack1 import SubPack1_Module
from Pack2 import Pack2_Module Pack1_Module.ModuleInfo()
SubPack1_Module.PrintInfo()
Pack2_Module.ModuleInfo()
其中Pack1中的__init__.py定义了__all__:
__all__ = ["SubPack1_Module"]
导入父包中的模块
导入父包中的模块,比如在Pack1.SubPack1中的SubPack1_Module.py调用Pack1中的Pack1_Module.py模块:
from Pack1 import Pack1_Module
def Pack1Module():
Pack1_Module.ModuleInfo()
导入子包中的模块
比如在Pack1_Module中导入SubPack1中的SubPack1_Module:
from Pack1.SubPack1 import SubPack1_Module def InvokeSubPack1():
SubPack1_Module.PrintInfo()
导入兄弟包中的模块
这部分其实和第三方包的导入类似,我们需要将兄弟包导入到sys.path中,比如在Pack2中调用Pack1:
首先,在Pack2中导入Pack1的包路径,在Pack2中的__init__.py中导入(pycharm好像不需要这一步,VS2013的工程需要,不过加上没有什么错):
import sys sys.path.append("/Users/xualvin/Bokeyuan/Pack1")
其次在Pack2中的模块中调用Pack1,导入方式和Python自带包一样:
from Pack1.SubPack1 import SubPack1_Module
from Pack1 import Pack1_Module def InvokePack1():
Pack1_Module.ModuleInfo()
SubPack1_Module.PrintInfo()
总结
Python中的包导入我们只需要注意两点:一是导入的是不是包,二是导入的包路径是否能够被找到(sys.path或者本工程中),只要平时写程序的时候多注意,肯定可以避免很多麻烦。
最新文章
- screen:多重视窗管理程序
- jQuery网页版五子棋小游戏源码下载
- SAML 2.0 setup steps, 效果图
- 前端开发薪资之各地区对比(图文分析)(share)
- [ZigBee] 9、ZigBee之AD剖析——AD采集CC2530温度串口显示
- 微信将推指纹支付 ";指付通";会与Touch ID整合吗
- The Triangle
- spring bean的初始化
- UGUI的优点新UI系统
- 编写 Objective-C 代码
- POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数
- C#_FindWindow
- 重温Javascript(一)
- Python配置文件实现
- javap -c命令详解
- PHP全栈学习笔记8
- Aras 引入外部的dll
- React Native - 网页组件(WebView)的使用详解
- 04 if条件判断 流程控制
- 9102年了,你还在用for循环操作集合?
热门文章
- [转帖]IBM POWER系列处理器的前世今生
- pandas创建一个日期
- p3c安装使用 编码规范扫描 阿里巴巴出品,挺好用的
- caffe运行错误: im2col.cu:61] Check failed: error == cudaSuccess (8 vs. 0) invalid device function
- Layui_Tree模块遍历HDFS
- POJ2492-A Bug's Life-并查集扩展应用
- BZOJ1002 [FJOI2007] 轮状病毒 【递推】
- day14 装饰器模拟验证附加功能
- java 按概率产生
- MT【46】不动点,稳定点几何直观