2012-03-07 60 views
27

在讨伐令我的应用程序pip -installable,我打大的战斗与setuptoolsdistribute。我假设我的依赖关系是正确的,即安装pip install myapp应该可以正确填充虚拟环境。不过,我想简化开发,而我在这,所以我的目标是先建立一个空virtualenv,使setup.py test(后来setup.py develop,但是这是一个完全不同的战斗)与所有定义的依赖填充它。如何强制`setup.py test`将依赖关系安装到我的`virtualenv`中?

现在我的问题是:无论我多么努力地尝试,我所得到的只是依赖项安装为.egg s在我的项目目录中,这至少是次优的。我试图创建一个新的setuptools命令,它会使用pip(这似乎工作,即使笨拙),但不能认真地是溶液(子类和压倒一切的即是)。

那么我该如何让setup.py test填写virtualevn而不是我的工作目录?

+0

你能你的'蟒蛇setup.py develop'命令的输出添加到这个问题?当我在virtualenv中运行它时,它将依赖关系安装到我的virtualenv中。 – Chris 2012-04-28 21:04:49

+0

@Chris:不是'tests_requires'依赖关系。 – Flimm 2013-03-25 10:51:29

回答

11

按照设计,您不能使tests_requiressetup_requires项进入虚拟环境。这个想法是将执行测试/设置所需的东西与实际使用正在安装的软件包所需的东西分开。例如,我可能会要求在我的软件包上运行测试时需要“覆盖”模块,但它并未被我的任何代码使用。因此,如果我在运行测试时没有在自己的环境中进行“覆盖”,如果我的软件包不需要它,我不希望将“覆盖率”安装到环境中。

+2

那么tests_requires的目的是什么? – 2014-11-09 06:18:15

+2

在某些情况下,您的测试可能会有一个额外的依赖项,您的程序包没有执行其测试。一个特殊的例子是“鼻子”包,它可能永远不会在你的项目的其他任何地方使用,但测试。这使您可以在不进行测试的情况下发运包装,而不会让用户不需要依赖,以使包装正常工作。 – 2014-11-19 21:59:40

+4

我的意思是test_requires的目的,如果它只是被忽略......我完全错过了它不会被忽略做'setup.py测试'/ venv行为似乎令人惊讶,我明白它不应该是默认的,但是你应该可以强制pip安装test_requires ... http:// stackoverflow。com/a/15422703/1240268 – 2014-11-20 00:19:48

-5

如果您使用的是setuptools,则可以使用setup方法的tests_require关键字参数指定测试依赖关系。

from setuptools import setup 

setup(
    name='your-package-name', 
    version='1.0.0', 
    author='me', 
    author_email='[email protected]', 
    install_requires=['Pygments>=1.4'], 
    tests_require=['nose'], 
    packages=[ 
     'your_package_name', 
    ], 
) 

当您运行python setup.py test,这将检查nose如果不是已经可以使用pip它安装到当前活动virtualenv

请注意,如果您使用distribute.core.setup(也不会有test命令可用),则此参数将被忽略。

+0

它不会在我的经验中使用pip。 – Flimm 2013-03-25 10:50:33

+0

这正是OP所做的 - 结束了所有的.egg dirs – UloPe 2013-10-13 15:42:03

+5

这个答案显然是不正确的。在[DOC](http://pythonhosted.org/setuptools/setuptools.html#new-and-changed-setup-keywords)指出,setuptools的将使用EasyInstall到'tests_require'软件包安装到“项目的设置目录”,无论这可能意味着什么 – bukzor 2014-01-07 22:55:52