本文主要是介绍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(导包)自定义包并导入之的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!