接下来进入 subpackage1文件夹,编辑其中的 __init__.py文件,输入以下代码:
- from
- .
- import
- module_x
- from
- .
- import
- module_y
现在编辑 module_x.py文件,输入以下代码:
- from
- .module_y
- import
- spam
- as
- ham
- def
- main():
- ham()
最后编辑 module_y.py文件,输入以下代码:
- def
- spam():
-
- print
- (
- 'spam '
- *
- 3
- )
打开终端, cd至 my_package包所在的文件夹,但不要进入 my_package。在这个文件夹下运行Python解释器。我使用的是IPython,因为它的自动补全功能非常方便:
- In
- [
- 1
- ]:
- import
- my_package
- In
- [
- 2
- ]: my_package.subpackage1.module_x
- Out
- [
- 2
- ]: <
- module
-
- 'my_package.subpackage1.module_x'
-
- from
-
- 'my_package/subpackage1/module_x.py'
- >
- In
- [
- 3
- ]: my_package.subpackage1.module_x.main()
- spam spam spam
相对导入适用于你最终要放入包中的代码。如果你编写了很多相关性强的代码,那么应该采用这种导入方式。你会发现PyPI上有很多流行的包也是采用了相对导入。还要注意一点,如果你想要跨越多个文件层级进行导入,只需要使用多个句点即可。不过,PEP 328建议相对导入的层级不要超过两层。
还要注意一点,如果你往 module_x.py文件中添加了 if__name__==‘__main__’,然后试图运行这个文件,你会碰到一个很难理解的错误。编辑一下文件,试试看吧!
- from
- . module_y
- import
- spam
- as
- ham
- def
- main():
- ham()
- if
- __name__ ==
- '__main__'
- :
-
- # This won't work!
- main()
现在从终端进入 subpackage1文件夹,执行以下命令:
- python module_x.py
如果你使用的是Python 2,你应该会看到下面的错误信息:
- Traceback
- (most recent call
- last
- ):
-
- File
-
- "module_x.py"
- , line
- 1
- ,
- in
-
- <module>
-
- from
- . module_y
- import
- spam
- as
- ham
- ValueError
- :
- Attempted
- relative
- import
-
- in
- non-
- package
如果你使用的是Python 3,错误信息大概是这样的:
- Traceback
- (most recent call
- last
- ):
-
- File
-
- "module_x.py"
- , line
- 1
- ,
- in
-
- <module>
-
- from
- . module_y
- import
- spam
- as
- ham
- SystemError
- :
- Parent
-
- module
-
- ''
-
- not
- loaded, cannot perform relative
- import
这指的是, module_x.py是某个包中的一个模块,而你试图以脚本模式执行,但是这种模式不支持相对导入。
(编辑:ASP站长网)
|