setup.py nosetests命令在指定package_dir时抛出ImportError

时间:2015-12-21 16:43:46

标签: python setuptools nose software-distribution

当setup.py指定与包名称不同的package_dir时,由于ImportError,setup.py nosetests函数失败。以下是一个最小的例子。

目录结构:

setup.py
src/
    __init__.py
    myclass.py
unittests/
    __init__.py
    test.py

init文件为空。 MyClass很简单:

class myclass():
    def __init__():
        a=10

test.py只是实例化myclass的一个实例:

import unittest
import mypkg

class Tests(unittest.TestCase):
    def _run_test(self):
        a = mypkg.myclass()

setup.py文件如下

from setuptools import setup

setup(
    name = 'mypkg',
    packages = ['mypkg'],
    package_dir={'mypkg':'src'}
    )

它正确构建和安装,但在安装之前,您将获得:

python3.4 setup.py nosetests
running nosetests
running egg_info
writing top-level names to mypkg.egg-info/top_level.txt
writing dependency_links to mypkg.egg-info/dependency_links.txt
writing mypkg.egg-info/PKG-INFO
reading manifest file 'mypkg.egg-info/SOURCES.txt'
writing manifest file 'mypkg.egg-info/SOURCES.txt'
E
======================================================================
ERROR: Failure: ImportError (No module named 'mypkg')
----------------------------------------------------------------------
Traceback (most recent call last):
          :
          :
          :
  File "<root_dir>/unittests/test.py", line 2, in <module>
    import mypkg
ImportError: No module named 'mypkg'

----------------------------------------------------------------------
Ran 1 test in 0.026s

FAILED (errors=1)

我已经把它追了回来,我很确定会发生这种情况,因为在setup.py中我通过使用package_dir有效地重命名目录。是否有一些技巧可以在不改变目录结构的情况下进行nosetests工作?

注意:这是使用python3.4和setuptools版本2.1以及nosetests版本1.3.4运行的。

2 个答案:

答案 0 :(得分:0)

您必须指定包含mypkg的py文件:

from yourfile import mypkg 

由于

答案 1 :(得分:0)

我找到了办法,尽管它不是很漂亮...... 但是这里有:

确保测试实际上可以访问所有内容的一种方法是在运行nosetests之前构建。 setuptools的Nosetests命令实际上会执行此操作,但如果它可以是懒惰并尝试运行测试 - 由于安装魔术重新排列包结构而失败。要在执行前强制进行nosetests,请添加标志

use_2to3 = True

到setup.py命令。

请注意,如果您不想运行2to3(假设您有一些python2.7模块,您对该中断感到满意),这将无效。

最后,除了setup.py之外,一切都保持不变,如下所示:

from setuptools import setup

setup(
    name = 'mypkg',
    packages = ['mypkg','unittests'],
    package_dir={'':'src'},
    use_2to3 = True,
    )