本文主要是介绍python2和python3(导包)自定义包并导入之,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、module和Package的定义
A module is a file containing Python definitions and executable statements( intended to initialize the module), file name is the module name
Packages are a way of structuring Python’s module namespace by using “dotted module names”.
也就是说package是module(文件)的一种组织结构,这种组织结构用'.'来组织上下层次关系,如下所示:
sound/ Top-level package__init__.py Initialize the sound packageformats/ Subpackage for file format conversions__init__.pywavread.pywavwrite.pyaiffread.pyaiffwrite.pyauread.pyauwrite.py...effects/ Subpackage for sound effects__init__.pyecho.pysurround.pyreverse.py...filters/ Subpackage for filters__init__.pyequalizer.pyvocoder.pykaraoke.py
package的定义有了,那么如何来表现呢?
在解析器搜索过程中,把一个含有__init__.py文件的目录(文件夹)视作package。
目录的存储层级就是包和模块的层级,在引用时候‘.’来表现这种上下层关系就可以了。
如导入sound目录下的effects目录下的echo模块只需要
import sound.effects.echo
or
from sound.effects import echo
(代码一)
二、包内引用(Intra-package References)
同包内的子模块之间可以通过绝对路径的方式相互引用,如上面的import sound.effects.echo,里面的sound就
可以通过遍历sys.path里面目录搜索到。
如果觉得绝对路径引用不合适,还可以选择相对导入 relative imports,相对导入只需要将某一层替换为'.'或者'..'
如下
from . import echo
from .. import formats
from ..filters import equalizer
这里面'.'代表当前目录所在的包(子包),'..'代表上级目录所在的包(子包)。
(实际测试import .effects.echo无效)
三、实战演示
1) python2自定义包并导入
首先在任意路径创建一个文件夹,来放我们自定义的包的文件。
我的是创建在/home/xyh/test_package,下边是我的目录结构。要在另一个不相关的文件夹下的python应用中引用到我们自定义的包。就是在/home/xyh/test_package2/use_lucky_package.py中导入lucky_package.py这个包,测试直接
import lucky_package或者直接from test_package import lucky_package是不行的。
需要在test_package文件夹中创建_init_.py文件,里边什么都不需要编辑。尝试一下,可以了。

注释:如果有初始化需要可以放到_init_.py中。
2) python3自定义包并导入
python 3.3+开始支持隐式命名空间包。
通俗的讲就是如果_init_.py中不需要放初始化,那么可以直接省略掉
如果_init_.py中的初始化不能省略,那么_init_.py可以像python2中一样保留下来。
parent_package/__init__.py <- EMPTY, NOT NECESSARY in Python 3.3+child_package/__init__.py <- STILL REQUIRED if you want to run an initialization scriptchild1.pychild2.pychild3.py
如果在python3中要导入同目录到包,还可以在包名前加上一个. ,来解决找不到包的问题,如下:
from .user import User
from .dir import Dir
常见错误
from .foo import foo
执行时候报错
ImportError: attempted relative import with no known parent package
把.去掉,同时把foo.py的目录添加到PYTHONPATH中即可
解释:把.去掉那么就不是导package了,而是导入module,解析器搜索module的默认目录在
sys.path变量里面,sys.path变量默认被初始化成
build-in
The directory containing the input script (or the current directory when no file is specified).(同目录, 注意是主脚本的同目录)
PYTHONPATH(a list of directory names, with the same syntax as the shell variablePATH).The installation-dependent default.
所组成的list
这篇关于python2和python3(导包)自定义包并导入之的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!