如何从当前文件夹旁边的文件夹导入模块?

22 投票
3 回答
16904 浏览
提问于 2025-04-17 05:39

我查阅了尽可能多的StackOverflow页面,尝试了所有找到的方法,但都没有成功。我还查看了关于导入的PEP页面,试过每一个例子,结果也都不行。

我有一个测试文件夹,里面放着单元测试,我需要导入我想测试的模块。这些模块在一个叫做'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

对于(tests = src)也出现了同样的错误:

from src import stringbuilder

3 个回答

-10

把那个文件夹添加到你的 PATH 里。

1
from folder import my_module

如果在folder文件夹里有一个__init__.py文件。

13

如果脚本是在一个包里面执行的,那么就需要用一些小技巧来让导入的模块正常工作。最常见的办法就是调整一下 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

撰写回答