【问题标题】:ImportError on subpackage when running setup.py test运行 setup.py 测试时子包上的 ImportError
【发布时间】:2011-04-14 10:45:45
【问题描述】:

我正在尝试为包含单元测试的 Python 项目创建安装包。我的项目布局如下:

setup.py
src/
    disttest/
        __init__.py
        core.py
tests/
    disttest/
        __init__.py
        testcore.py

我的setup.py 看起来像这样:

from distutils.core import setup
import setuptools

setup(name='disttest',
      version='0.1',
      package_dir={'': 'src'},
      packages=setuptools.find_packages('src'),
      test_suite='nose.collector',
      tests_require=['Nose'],
      )

文件tests/disttest/testcore.py 包含行from disttest.core import DistTestCore

运行setup.py test 现在会给出ImportError: No module named core

setup.py install 之后,python -c "from disttest.core import DistTestCore" 工作正常。如果我将import core 放入src/disttest/__init__.py,它也可以工作,但我真的不想维护它,它似乎只对测试有必要。

这是为什么呢?修复它的正确方法是什么?

【问题讨论】:

  • 我想知道:在setup.py test 之前执行setup.py install 可能是常见的做法吗? setuptools documentation 听起来不是这样,我的资源应该自动放在sys.path 上。也许nose.collector 不知道我的package_dir 基本目录?
  • 你是如何在 testcore.py 中导入核心的?你的 sys.path/PYTHONPATH 到底是什么?

标签: python setuptools distutils


【解决方案1】:

您可能需要仔细检查这一点,但您的测试似乎正在导入tests/ 目录中的disttest 包,而不是src/ 目录中的被测包。

为什么需要使用与被测包同名的包?我只需将 testcore 模块移动到测试目录,或重命名 tests/disttest 包并完全避免潜在的命名冲突。

在任何情况下,您都希望在导入失败之前插入 import pdb; pdb.set_trace() 行,并使用不同的导入语句来查看从哪里导入的内容(import sys; sys.modules['modulename'].__file__ 是您的朋友),以便您获得更好的洞察力出了什么问题。

【讨论】:

  • 我认为你的假设是绝对正确的。 setup.py test 启动我的测试的方式,它可能将tests/disttest/ 放在src/disttest/ 的前面sys.path 和Python 永远不会“合并”同名的包。只需将 tests/disttest/ 重命名为 tests/disttest2(显然仅用于测试目的)即可解决问题。我将不得不检查其他项目是如何做到这一点的以及这里有哪些最佳实践,因为将所有测试模块放在同一个目录中当然不是大型项目的选择。感谢调试提示!
  • 我不知道为什么 src/disttest/__init__.pytests/disttest/__init__.py 之前执行。 (我通过向它们添加打印语句确认了这一点。)我本来希望它是相反的(或者可能src/disttest/__init__.py根本没有被执行,因为所有导入都只是导入tests/disttest/),但这只是出来了出于好奇,我现在可以解决我的问题了。
猜你喜欢
  • 2014-05-07
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-23
  • 2019-07-01
  • 2018-08-16
  • 2013-11-07
  • 1970-01-01
相关资源
最近更新 更多