首页 文章

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

提问于
浏览
12

可能重复:如何在Python模块中正确使用相对或绝对导入?

我有这个文件布局,如下例所示:(在这里下载: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 回答

  • 22

    来自文档:

    你可以看到这个:

    相对导入使用模块的name属性来确定模块在包层次结构中的位置 . 如果模块的名称不包含任何包信息(例如,它设置为'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可能会有所帮助:

    希望这可以帮助 .

相关问题