我无法从2.7中的父目录导入模块,我不知道为什么。任何帮助将不胜感激。
我有一个包含此目录结构的Python包:
source/
|--foo/__init__.py
|--foo/bar/__init__.py
|--foo/bar/nested.py
|--foo/top.py
tests/
|--helpers/__init__.py
|--foo/__init__.py
|--foo/bar/__init__.py
|--foo/bar/nested_test.py
|--foo/top_test.py
setup.py
setup.cfg
tox.ini
我几乎可以互换使用pytest
和python setup.py test
来运行我的测试。在tox.ini
,我有:
[tox]
envlist = py27
[testenv]
commands = pytest
deps = pytest
[pytest]
testpaths=tests
请注意,我实际上并没有使用tox
来运行我的测试。
在setup.cfg
:
[aliases]
test=pytest
我不是百分百肯定,但我认为此设置意味着当我运行python setup.py test
时,它实际上只运行pytest
,因此可能不相关对这个问题。
在foo/top_test.py
中,我可以import tests.helpers
,但在foo/bar/nested_test.py
中,同一导入会引发ImportError
,说明找不到该模块。
为什么会这样,我该如何解决?
我在运行pytest
和python setup.py test
之后尝试在干净的virtualenv中运行pip install pytest
和pip install -r requirements.txt
(我的requirements.txt
基本上是一个空白文件-e
和-i
设置为私人仓库。
注意:我可以从项目的根目录和python
打开import tests._helper
REPL,没有任何问题。
我还尝试将tests
和tests.helpers
添加到tests_require
中setuptools.setup()
函数的setup.py
参数中,但它看起来像是尝试从远程索引安装,而不是使用本地模块。
我还尝试在我的foo / bar / nested_test.py中附加sys.path
:
import os
import sys
sys.path.append(os.path.realpath('tests'))
答案 0 :(得分:1)
我注意到的一件事是你似乎没有tests/__init__.py
。不确定在您的情况下是否重要,但在下面的示例中确实如此。
每当我遇到这样的问题时,我都尝试用尽可能少的东西设置一个简化的测试用例。获取setuptools,pytest和所有其他噪音,只需调试模块结构,然后在知道结构合理后再添加它们。
例如,这是一个脚本
#!/bin/bash
rm -rf tests
mkdir -p tests/foo/bar
mkdir -p tests/helpers
touch tests/__init__.py
touch tests/foo/__init__.py
touch tests/foo/bar/__init__.py
touch tests/helpers/__init__.py
echo 'import tests.helpers' > tests/foo/top_test.py
echo 'import tests.helpers' > tests/foo/bar/nested_test.py
tree tests
python -c 'import tests.foo.bar.nested_test; print "got here"'
产生输出
tests
|-- __init__.py
|-- foo
| |-- __init__.py
| |-- bar
| | |-- __init__.py
| | `-- nested_test.py
| `-- top_test.py
`-- helpers
`-- __init__.py
3 directories, 6 files
got here
一旦你有这样一个简单的脚本,你就可以交互式地试验你的导入。