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

Jos*_*iah 12 python import

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

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

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
Run Code Online (Sandbox Code Playgroud)

这就是:

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
Run Code Online (Sandbox Code Playgroud)

我有python 2.7.2.我有

__init__.py
Run Code Online (Sandbox Code Playgroud)

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

icy*_*com 22

来自文档:

你可以看到这个:

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

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

python -m package.subpackage1.moduleX
Run Code Online (Sandbox Code Playgroud)

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

package/
    __init__.py
    subpackage1/
        __init__.py
        moduleX.py
        moduleY.py
    subpackage2/
        __init__.py
        moduleZ.py
    moduleA.py
Run Code Online (Sandbox Code Playgroud)

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

c:\>python -m package.subpackage1.moduleX
Run Code Online (Sandbox Code Playgroud)

注意一件事 - 进口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
Run Code Online (Sandbox Code Playgroud)

倒数第二个:

from ...package import bar
Run Code Online (Sandbox Code Playgroud)

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

对于这一行:

from ...sys import path
Run Code Online (Sandbox Code Playgroud)

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

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

另请参阅有关此内容的其他SOq可能会有所帮助:

希望这可以帮助.


归档时间:

查看次数:

17041 次

最近记录:

14 年 前