可能重复:
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
每个目录中的个文件。 为什么这段代码不起作用?
答案 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:
希望这有帮助。