我有包p有模块a和b.a依赖于b:
b.py 内容:
import a
Run Code Online (Sandbox Code Playgroud)
不过,我想确保的是b进口我a来自同一个模块p包目录,不是任何a的模块PYTHONPATH.
所以我想改变b.py如下:
from . import a
Run Code Online (Sandbox Code Playgroud)
只要b我在p包目录之外导入,这就可以工作.给出以下文件:
/tmp
/p
a.py
b.py
__init__.py
Run Code Online (Sandbox Code Playgroud)
以下作品:
$ cd /tmp
$ echo 'import p.b' | python
Run Code Online (Sandbox Code Playgroud)
以下不起作用:
$ cd /tmp/p
$ echo 'import b' | python
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "b.py", line 1, in <module>
from . import a
ValueError: Attempted relative import in non-package
Run Code Online (Sandbox Code Playgroud)
为什么?
PS我正在使用Python 2.7.3
重新阅读Python 导入文档后,我原来问题的正确答案是:
要确保从其自己的包中b导入a,只需在以下内容中编写以下内容b:
import a
Run Code Online (Sandbox Code Playgroud)
以下是文档的引用:
子模块通常需要相互引用.例如,环绕声模块可能使用echo模块.事实上,这样的引用是如此常见,以至于在查看标准模块搜索路径之前,import语句首先在包含包中查找.
注意:正如JF Sebastian在下面的评论中所建议的,不建议使用隐式导入,事实上它们已经在Python 3中使用了.
因为里面有一个__init__.py文件/p。这个文件告诉Python:“这个文件夹中的所有模块都在包中p”。
只要文件存在,无论您身在何处,都__init__.py可以导入b为。p.b
所以正确的导入b.py是:import p.a
| 归档时间: |
|
| 查看次数: |
33038 次 |
| 最近记录: |