我尽可能多地检查了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)
如果脚本是从包内部执行的,则需要采用各种技巧来使导入正常工作。其中最常见的可能是操作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)