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

时间:2011-11-04 17:08:27

标签: python import module

我尽可能多地检查了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

((tests = src)发生相同的错误:

from src import stringbuilder

3 个答案:

答案 0 :(得分:4)

如果从包内执行脚本,则需要使用各种hack来使导入正常工作。可能最常见的是操纵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]

使用普通的import语句无法实现此目的。

通常更好的解决方案是简单地避免在包内运行脚本。而是将所有脚本放在包中的包含目录中。鉴于当前运行的脚本的目录自动添加到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

答案 1 :(得分:0)

from folder import my_module

如果__init__.py中有folder个文件。

答案 2 :(得分:-6)

将该文件夹添加到PATH