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

10 python import module

我尽可能多地检查了SO页面并尝试了我发现的所有内容,但没有一个成功.我还检查了有关导入的PEP页面,并尝试了每个例子,但没有一个有效.

我有一个带有单元测试的测试文件夹,我需要导入我想要测试的模块.这些模块位于名为'src'的文件夹中,该文件夹位于src文件夹旁边.

文件夹/文件看起来像这样:

Project / 
        src /
            stringbuilder.py
            __init__.py
        tests / 
            stringbuilder_test.py
            __init__.py
        main.py
        __init__.py
Run Code Online (Sandbox Code Playgroud)

我已尽力而为:添加__init__.py到每个文件夹,使其成为包含项目主文件夹的模块.

import src.module_to_test 
from ..src.module_to_test import function_to_test
from ..src import module_to_test
Run Code Online (Sandbox Code Playgroud)

我测试了所有其他失败的组合.我开始认为我的设置或理解一定有问题 - 我认为这很简单.

如果我发现任何明显错误,请告诉我.

from tests import stringbuilder
Run Code Online (Sandbox Code Playgroud)

错误信息:

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

(但是tests = src)发生了同样的错误:

from src import stringbuilder
Run Code Online (Sandbox Code Playgroud)

ekh*_*oro 5

如果脚本是从包内部执行的,则需要采用各种技巧来使导入正常工作。其中最常见的可能是操作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]
Run Code Online (Sandbox Code Playgroud)

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

通常更好的解决方案是避免完全在包内运行脚本。而是将所有脚本放在包的外部包含目录中。鉴于当前正在运行的脚本的目录会自动添加到的开头sys.path,这将确保无论从何处执行脚本,都可以始终直接导入软件包。

因此目录结构可能如下所示:

project /
    package /
        __init__.py
        src /
            __init__.py
            stringbuilder.py
        tests / 
            __init__.py
            stringbuilder_test.py
    main.py
    test.py
Run Code Online (Sandbox Code Playgroud)

然后,test.py脚本可以像这样导入其测试:

from package.tests import stringbuilder_test
Run Code Online (Sandbox Code Playgroud)

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

from package.src import stringbuilder
Run Code Online (Sandbox Code Playgroud)