python相对导入示例代码无法正常工作。

17 浏览
0 Comments

python相对导入示例代码无法正常工作。

这个问题已经在这里有了答案:

可能的重复问题:

如何在Python模块中正确使用相对或绝对引用?

我有这个文件布局,如此例子所示:

(在此处下载: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 
    from .moduleY import spam
ValueError: Attempted relative import in non-package

我有Python 2.7.2。我有

__init__.py

每个目录中的文件。

为什么这段代码不起作用?

admin 更改状态以发布 2023年5月20日
0
0 Comments

根据文档:

可以看到这个:

相对导入使用模块的 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链接中有一个注释:

请注意,虽然最后一个案例是合法的,但肯定是不鼓励的("insane"是Guido使用的词)。

另请参阅其他可能有助于此的SOqs:

希望这有所帮助。

0