python相对导入示例代码不起作用

时间:2012-02-03 02:48:55

标签: python import

  

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

我有这个文件布局,如下例所示: (在这里下载:http://www.mediafire.com/?oug42nzvxrvoms4http://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 个答案:

答案 0 :(得分:22)

来自文档:

你可以看到:

  

相对导入使用模块的名称属性来确定模块在包层次结构中的位置。如果模块的名称不包含任何包信息(例如,它设置为' main '),则解析相对导入,就像模块是顶级模块一样,无论模块实际位于何处在文件系统上。

将其作为python moduleX.py运行,您正在完成上述操作。相反,试试这个:

python -m package.subpackage1.moduleX

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

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:

希望这有帮助。