强制从当前目录导入模块

Zaa*_*Hai 17 python

我有包p有模块ab.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

Zaa*_*Hai 9

重新阅读Python 导入文档后,我原来问题的正确答案是:

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

import a
Run Code Online (Sandbox Code Playgroud)

以下是文档的引用:

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

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

  • 不要使用隐式相对导入(它们在Python 3中消失了).总是使用绝对导入(`来自p import a`(如果有`p/p.p​​y`文件,则从__future__ import absolute_import`添加`)或显式相对导入(`from.import a`(如果不是)一个`__main__`模块)).不要在Python包目录中运行脚本; 它将此目录预先添加到sys.path,这可能导致同一模块在不同的名称下可用,从而导致与模块级状态相关的错误(如果使用隐式相对导入;在这种情况下,它也会影响其他顶层模块). (9认同)

Aar*_*lla 7

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

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

所以正确的导入b.py是:import p.a