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或者本工程中),只要平时写程序的时候多注意,肯定可以避免很多麻烦。
Python中的包ImportError的更多相关文章
- python中引入包的时候报错AttributeError: module 'sys' has no attribute 'setdefaultencoding'解决方法?
python中引入包的时候报错:import unittestimport smtplibimport timeimport osimport sysimp.reload(sys)sys.setdef ...
- [转]Python中出错:ImportError: No module named win32com.client
Python中出错:ImportError: No module named win32com.client [问题] [已解决]Python中处理操作Excel中的图表(Chart,Graph) 的 ...
- [Python]Python中的包(Package)
参考官方文档中的Module和Glosssary中的描述.Module: https://docs.python.org/3/tutorial/modules.html#packagesGlossar ...
- 关于python中的包,模块导入的问题详解(一)
最近由于初学python,对包,模块的导入问题进行了资料的搜集,查阅,在这里做一个总结: 一: import 模块 在import的过程中发生了什么?我们用一个实验来说明: 以上截图表明:在impor ...
- 菜鸟教程-python中的包
转载自:http://www.runoob.com/python/python-modules.html 包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python ...
- python中模块包的离线下载教程
1.简介 当我们进行Python项目的迁移时(例如迁移到另外一台服务器上),如果该服务器要求离线安装, 往往需要我们将项目中的所需模块包进行离线操作. 2.教程 2.1 首先安装pip2pi模块,它可 ...
- 关于python中的包,模块导入的问题详解(二)
from import导入 紧接着的是from xx import xx 语法 1 ################ 2 from my_moudule import name 3 print(na ...
- python中的包和文件夹的区别
python的模块,就不得不说包(package),package是module的集合,在一个package中有很多的module, 还是以之前的index.py与baiduHq.py模块为案例,说明 ...
- Python中常用包——sklearn主要模块和基本使用方法
在从事数据科学的人中,最常用的工具就是R和Python了,每个工具都有其利弊,但是Python在各方面都相对胜出一些,这是因为scikit-learn库实现了很多机器学习算法. 加载数据(Data L ...
随机推荐
- 转载《ionic 热更新 cordova-hot-code-push》
cordova-hot-code-push ,Cordova热代码推送插件提供了在应用程序中执行基于Web的内容的自动更新的功能.使用此插件可以更新存储在项目的www文件夹中的所有内容. cordov ...
- KNN python实践
本文实现了一个KNN算法,准备用作词频统计改进版本之中,这篇博文是从我另一个刚开的博客中copy过来的. KNN算法是一个简单的分类算法,它的动机特别简单:与一个样本点距离近的其他样本点绝大部分属于什 ...
- flask客户端测试使用设置cookie参数
今天在对flask客户端进行测试,然后看到我们服务器端用请求前钩子写了这样的代码 @app.before_requestdef before_request(): session = request. ...
- [Caffe]:关于*** Aborted at 1479432790 (unix time) try "date -d @1479432790" 错误的另一种原因
问题:设置solver.prototxt时,lr_policy:"step",运行时出现下面问题 *** Aborted at (unix time) try "date ...
- pgm11
这里简要的讨论 hybrid network 与一些时序数据的分析. hybrid network 指网络中存在离散随机变量与连续随机变量,这种情况下一般非常麻烦,这主要是因为连续型随机变量需要使用某 ...
- BZOJ1018[SHOI2008]堵塞的交通——线段树
题目描述 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可以被看成是一个2行C列的矩形网格,网格上的每个点代表一个城市,相邻的城市之间有一条道路,所以总 ...
- hdu1728 逃离迷宫
给定一个m × n (m行, n列)的迷宫,迷宫中有两个位置,gloria想从迷宫的一个位置走到另外一个位置,当然迷宫中有些地方是空地,gloria可以穿越,有些地方是障碍,她必须绕行,从迷宫的一个位 ...
- day11 filter函数
场景模拟:我想判断某个列表里面的某个元素怎么怎么样 基础方法,如果需要判断多次则重复代码 ret = [] move_peole = ["alex","sb_wupeiq ...
- 【POI 每日题解 #4】 [POI2008]MAF-Mafia
[POI2008]MAF-Mafia 很容易看出是拓扑 但不容易想出来怎么做[可能是我太菜 首先 入度为零的人是肯定死不了的 接着 我们分成环和链分析 对于一个链 最多的情况就是顺着一个个开枪 最后剩 ...
- 【题解】 Codeforces Edu41 F. k-substrings (字符串Hash)
题面戳我 Solution 我们正着每次都要枚举从长到短,时间复杂度承受不了,但是我们可以发现一个规律,假设某次的答案为\(x\),那么这个字符串为\(A+X+B\)组成,无论中间的\(X\)是重叠还 ...