强制从当前目录导入模块

时间:2013-01-08 13:39:26

标签: python

我的软件包p包含模块aba依赖于b

b.py内容:

import a

但是,我希望确保 b从同一个a软件包目录导入我的p模块,而不是从a模块导入PYTHONPATH模块b.py

所以我试图改变from . import a ,如下所示:

b

只要我在p包目录之外导入/tmp /p a.py b.py __init__.py ,这就有效。鉴于以下文件:

$ cd /tmp
$ echo 'import p.b' | python

以下作品:

$ 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

以下内容不起作用:

{{1}}

为什么吗

P.S。我使用的是Python 2.7.3

3 个答案:

答案 0 :(得分:8)

重读Python import documentation后,我原来问题的正确答案是:

要确保b从其自己的软件包中导入a,只需在b中编写以下内容:

import a

以下是文档的引用:

  

子模块通常需要相互引用。例如,   环绕声模块可能使用echo模块。事实上,这样的引用   是如此常见,导入语句首先在包含中查找   在查看标准模块搜索路径之前打包。

注意:正如J.F. Sebastian在下面的评论中所建议的,不建议使用隐式导入,事实上它们已经在Python 3中使用了。

答案 1 :(得分:0)

因为__init__.py中有/p个文件。该文件告诉Python:“此文件夹中的所有模块都在包p”中。

只要__init__.py文件存在,您就可以b导入p.b,无论您身在何处。

因此,b.py中的正确导入为:import p.a

答案 2 :(得分:0)

相对导入仅适用于包。

如果从您所在的位置导入b,则没有包的概念,因此无法进行相对导入。

如果您导入p.b,则b包中的模块为c

重要的不是目录结构,而是包结构。