【问题标题】:How to import a module from a folder next to the current folder?如何从当前文件夹旁边的文件夹中导入模块?
【发布时间】:2026-02-15 06:15:01
【问题描述】:

我已经检查了尽可能多的 SO 页面,并尝试了我找到的所有内容,但没有一个成功。我还检查了有关导入的 PEP 页面并尝试了每个示例,但没有一个有效。

我有一个包含单元测试的测试文件夹,我需要导入我想要测试的模块。这些模块位于 src 文件夹旁边的名为“src”的文件夹中。

文件夹/文件如下所示:

Project / 
        src /
            stringbuilder.py
            __init__.py
        tests / 
            stringbuilder_test.py
            __init__.py
        main.py
        __init__.py

我已尽我所能:将__init__.py 添加到每个文件夹中,使其成为一个模块,包括项目的主文件夹。

import src.module_to_test 
from ..src.module_to_test import function_to_test
from ..src import module_to_test

我已经测试了所有其他组合都失败了。我开始认为我的设置或理解一定有问题——我认为这应该很简单。

如果我犯了任何明显的错误,请告诉我。

from tests import stringbuilder

错误信息:

$ ./stringbuilder_test.py
Traceback (most recent call last):
  File "./stringbuilder_test.py", line 14, in <module>
    from tests import stringbuilder
ImportError: No module named tests

同样的错误发生在 (but tests = src):

from src import stringbuilder

【问题讨论】:

  • 您在该文件夹中有__init__.py 文件吗?
  • 是的,项目文件夹、src文件夹和tests文件夹里都有一个。
  • 你能粘贴错误信息吗?也许有用。
  • 尝试:从stringbuilder_test导入类(需要导入哪个类)
  • “src”还是“测试”?您能否向我们提供有关您的文件和文件夹层次结构的更多详细信息?

标签: python import module


【解决方案1】:

如果脚本是从包内执行的,则需要使用各种技巧来使导入正常工作。其中最常见的可能是操纵sys.path

import sys, os

sys.path.insert(0,
    os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from src import stringbuilder

del sys.path[0]

没有办法使用普通的导入语句来实现这一点。

通常更好的解决方案是完全避免在包内运行脚本。相反,将所有脚本包的包含目录中。鉴于当前运行脚本的目录会自动添加到sys.path的开头,这样可以保证无论从哪里执行脚本,始终可以直接导入包。

所以目录结构可能看起来像这样:

project /
    package /
        __init__.py
        src /
            __init__.py
            stringbuilder.py
        tests / 
            __init__.py
            stringbuilder_test.py
    main.py
    test.py

test.py 脚本可以像这样导入它的测试:

from package.tests import stringbuilder_test

stringbuilder_test.py 可以像这样导入src 模块:

from package.src import stringbuilder

【讨论】:

    【解决方案2】:
    from folder import my_module
    

    如果folder中有__init__.py文件。

    【讨论】:

    • 这失败了,它说没有名为文件夹的模块。
    • 呃,我想你应该用你的文件夹名称替换folder
    【解决方案3】:

    将该文件夹添加到您的PATH

    【讨论】:

    • 将它添加到 PYTHONPATH 稍微不那么可怕,但错过了问题的重点。添加到 PATH 丝毫没有帮助。