如何在Python中实现相对导入

24 投票
5 回答
38418 浏览
提问于 2025-04-16 09:45

考虑一下:

stuff/
    __init__.py
    mylib.py
    Foo/
        __init__.py
        main.py
        foo/
            __init__.py
            script.py

script.py 想要导入 mylib.py

这只是一个例子,但我其实想在父目录中相对导入一个模块。我尝试了各种方法,但遇到了这个错误……

尝试进行超出顶层包的相对导入

我在某个地方看到过,程序开始运行的脚本不应该放在包里面,所以我尝试像这样修改结构……

stuff/
    mylib.py
    foo.py // Equivalent of main.py in above
    foo/
        __init__.py
        script.py

但是我还是得到了同样的错误。

我该怎么做才能实现这个呢?这样做合适吗?

在 Python 2 中。

5 个回答

7

我在Windows 7上运行Python 3.4.2,搞得我头都疼。

当我运行以下命令时:

python -m unittest python -m unittest discover

我总是遇到“尝试进行超出顶层包的相对导入”的错误。

对我来说,解决办法是把我的[test_stock.py]文件中的“..”去掉。原来的代码是: from ..stock import Stock

我把它改成了: from stock import Stock

这样就可以正常工作了。

文件夹结构:

C:\
  |
  +-- stock_alerter
             |
             +-- __init__.py
             +-- stock.py
             |
             \-- tests
                   |
                   +-- __init__.py
                   \-- test_stock.py
14

只要“stuff”不在你的Python路径中,你就没有其他选择,只能添加这个路径。

如果你知道你的 script.py 文件和“stuff”之间的层级关系,你可以这样做,例如:

import sys
import os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..'))
29

经过一番折腾,我终于搞明白了怎么设置这些东西。为了更具体一点,我不打算用那些常见的名字。我的项目目录是这样设置的...

tools/
    core/
        object_editor/
            # files that need to use ntlib.py
            editor.py # see example at bottom
            __init__.py
        state_editor/
            # files that need to use ntlib.py
            __init__.py
        ntlib.py
        __init__.py # core is the top level package
    LICENSE
    state_editor.py # equivalent to main.py for the state editor
    object_editor.py # equivalent to main.py for the object editor

object_editor.py 文件里,有一行代码看起来是这样的...

from core.object_editor import editor

editor.py 文件里,有一行代码看起来是这样的...

from .. import ntlib

或者可以是这样

from core import ntlib

关键是,在我提问时给出的例子中,“主”脚本是从包里面运行的。一旦我把它移出来,创建了一个特定的包(core),并把我想让编辑器共享的库(ntlib)放到那个包里,一切就顺利多了。

撰写回答