这是我的项目设置:
my_project
./my_project
./__init__.py
./foo
./__init__.py
./bar.py
./tests
./__init__.py
./test_bar.py
在test_bar.py
内我有以下import语句:
from foo import bar
但是,当我运行python /my_project/tests/test_bar.py
时,我收到此错误:
ImportError: No module named foo
。
有关如何解决此问题的任何想法?
答案 0 :(得分:9)
想想PYTHONPATH
上的内容。项目的顶级包是my_project
,因此必须是项目中任何内容导入的开始。
from my_project.foo import bar
您也可以使用相对导入,虽然这不是明确的,如果您更改了执行此导入的模块的相对位置,则会中断。
from ..foo import bar
理想情况下,test
文件夹根本不是包,并且不是应用程序包的一部分。请参阅good practices上的pytests页面。这需要您在包中添加setup.py
并在开发模式下将其安装到virtualenv。
pip install -e .
不要直接指向应用程序中的文件来运行测试。在正确构建/安装项目之后,使用发现机制来处理您用于为您运行测试的任何框架。例如,使用pytest,只需指向测试文件夹:
pytest tests
或者对于内置的unittest模块:
python -m unittest discover -s tests
答案 1 :(得分:1)
您可以使用相对导入:
from ..foo import bar
https://docs.python.org/2/whatsnew/2.5.html#pep-328-absolute-and-relative-imports
但我也认为使用绝对路径installing你的项目是更好的方式。
答案 2 :(得分:0)
import sys
sys.path.append('/path/to/my_project/')
现在您可以导入
from foo import bar