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