Python 模块相对引用,,文件结构如下pyth
Python 模块相对引用,,文件结构如下pyth
文件结构如下
python_directory/├── __init__.py└── app ├── __init__.py ├── sub1 │?? ├── __init__.py │?? └── mod1.py └── sub2 ├── __init__.py ├── mod2.py
除了 mod1.py,其他文件内容都为空。
mod1.py
print('__name__: {}'.format(__name__))print('__package__: {}'.format(__package__))from ..sub2 import mod2print('Import Successfully!')
如果 __package__ 不为空,相对引用会根据 __package__ 而不是 __name__[2]。
Relative Import In Non-Package
如果直接执行一个模块,那么它的 __name__ 为 __main__。Python 会认为这个模块是一个最顶层的模块,而不管这个模块在文件系统中的实际位置[1]。
$ pwd/path_to/python_directory$ python app/sub1/mod1.py __name__: __main____package__: NoneTraceback (most recent call last): File "app/sub1/mod1.py", line 3, in <module> from ..sub2 import mod2ValueError: Attempted relative import in non-package
一个最顶层的模块 -- 我理解为 Python 把这个模块复制到在一个单独的目录中然后再执行,由于该目录下只有这个一个模块,
所以它不是一个 package。
Beyond Top Level Package
$ pwd/path_to/python_directory/app$ python -m sub1.mod1__name__: __main____package__: sub1Traceback (most recent call last): File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 174, in _run_module_as_main "__main__", fname, loader, pkg_name) File "/usr/local/Cellar/python/2.7.13/Frameworks/Python.framework/Versions/2.7/lib/python2.7/runpy.py", line 72, in _run_code exec code in run_globals File "/path_to/python_directory/app/sub1/mod1.py", line 4, in <module> from ..sub2 import mod2ValueError: Attempted relative import beyond toplevel package
由于 -m sub1.mod1,Python 将 package 的顶层视为 sub1,而 ..sub2 位于 app/,超过了当前的最顶层 sub1,所以报错。
└── app ├── __init__.py ├── sub1 │?? ├── __init__.py │?? └── mod1.py └── sub2
正确的调用
$ pwd/path_to/python_directory$ python -m app.sub1.mod1__name__: __main____package__: app.sub1Import Successfully!
此时 ..sub2 相当于 app.sub2。
参考
PEP 328 -- Imports: Multi-Line and Absolute/RelativePEP 366 -- Main module explicit relative importsPython 模块相对引用
相关内容
- python/django-上传excel文件并用pandas处理,,html文件<fo
- 【python】nuitka封装python,,官网:http://
- Python中setuptools做什么用的?,,概括setuptoo
- Python_time模块,,time模块:用于时
- Python-异常处理,,、异常 Except
- Python—字符串,,####Python
- python-函数对象应用,,---恢复内容开始-
- selenium3 + python3 - alert定位,selenium3python3,一、alert\co
- 40、python模块学习-配置文件模块,python配置文件,来看一
- Python-异步编程,,1、异步 同步 函
评论关闭