python相对导入示例代码不起作用[重复]

Posted

技术标签:

【中文标题】python相对导入示例代码不起作用[重复]【英文标题】:python relative import example code does not work [duplicate] 【发布时间】:2012-02-25 17:47:04 【问题描述】:

可能重复:How to properly use relative or absolute imports in Python modules?

我有这个文件布局,如下例所示: (在这里下载:http://www.mediafire.com/?oug42nzvxrvoms4) http://www.python.org/dev/peps/pep-0328/#guido-s-decision

moduleX 包含:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

这就是发生的事情:

C:\package\subpackage1>python moduleX.py
Traceback (most recent call last):
  File "moduleX.py", line 1, in <module>
    from .moduleY import spam
ValueError: Attempted relative import in non-package

我有 python 2.7.2。我有

__init__.py

每个目录中的文件。 为什么这段代码不起作用?

【问题讨论】:

我发现这个问答比被标记为重复的那个更有用。 机器人重复标注器 ;-) 【参考方案1】:

来自文档:

http://www.python.org/dev/peps/pep-0328/#guido-s-decision

你可以看到这个:

相对导入使用模块的 name 属性来确定该模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它设置为 'ma​​in'),则相对导入将被解析为好像该模块是***模块,而不管模块实际位于何处在文件系统上。

通过以python moduleX.py 运行它,您正在执行上述操作。相反,试试这个:

python -m package.subpackage1.moduleX

这将导入 moduleX 并将顶层放在 package.json 中。从层次结构的顶部运行:

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py

即在你的情况下,直接来自c:\

c:\>python -m package.subpackage1.moduleX

注意一件事 - moduleX.py 中的导入是:

from .moduleY import spam
from .moduleY import spam as ham
from . import moduleY
from ..subpackage1 import moduleY
from ..subpackage2.moduleZ import eggs
from ..moduleA import foo
from ...package import bar
from ...sys import path

倒数第二个:

from ...package import bar

要求根文件夹(在您的情况下为c:\)是一个包(即具有__init__.py)。此外,它需要在package\__init__.py 中定义的 bar 变量,该变量目前不存在(因此将bar = 'bar!' 放在那里进行测试)。它还要求您上一级 - 因此您必须将 package 文件夹放在另一个文件夹中(因此您最终会得到 c:\toppackage\package)并运行 c:\python -m toppackage.package.subpackage1.moduleX

对于这一行:

from ...sys import path

上面的 PEP 328 链接中有一条注释:

请注意,虽然最后一种情况是合法的,但肯定不鼓励这样做(“疯狂”是 Guido 使用的词)。

另请参阅其他可能有帮助的 SOq:

How to do relative imports in Python? Can anyone explain python's relative imports? How to accomplish relative import in python python relative import weirdness Relative imports in Python

希望这会有所帮助。

【讨论】:

以上是关于python相对导入示例代码不起作用[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我想平滑我的 python matplotlib 图,代码不起作用 [重复]

SMTP仅发送正文不起作用Python [重复]

pypy 的导入钩子(自定义模块加载器)不起作用

@font-face 在 Firefox 中不起作用 [重复]

导入和导出方法在js文件中不起作用[重复]

试图制作一个简单的选项列表,不起作用(python 3)[重复]