从Python 2.7中的父目录导入模块

时间:2017-09-15 19:47:16

标签: python python-2.7 testing pytest

我无法从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

配置

我几乎可以互换使用pytestpython 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,说明找不到该模块。

为什么会这样,我该如何解决?

尝试

我在运行pytestpython setup.py test之后尝试在干净的virtualenv中运行pip install pytestpip install -r requirements.txt(我的requirements.txt基本上是一个空白文件-e-i设置为私人仓库。

注意:我可以从项目的根目录和python打开import tests._helper REPL,没有任何问题。

我还尝试将teststests.helpers添加到tests_requiresetuptools.setup()函数的setup.py参数中,但它看起来像是尝试从远程索引安装,而不是使用本地模块。

我还尝试在我的foo / bar / nested_test.py中附加sys.path

import os
import sys

sys.path.append(os.path.realpath('tests'))

其他说明

  • 我不愿意将我的测试捆绑到每个包的源目录中
  • 目前我无法使用python 3

1 个答案:

答案 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

一旦你有这样一个简单的脚本,你就可以交互式地试验你的导入。