在虚拟环境中运行python鼻测试

在虚拟环境中运行python鼻测试,python,python-2.7,unit-testing,virtualenv,nose,Python,Python 2.7,Unit Testing,Virtualenv,Nose,我有一个脚本go.py,它需要在几个不同的模块上运行单元测试(使用nose),每个模块都有自己的虚拟环境 如何在测试之前激活每个虚拟环境,并在测试之后将其停用 i、 e.我想这样做(伪代码): 激活() 在虚拟环境中,有/bin/activate\u this.py 这正是我想要的。所以在go.py中我说 import os activate_this_file = os.path.join(env_dir,'bin/deactivate_this.py') execfile(activate_

我有一个脚本
go.py
,它需要在几个不同的模块上运行单元测试(使用nose),每个模块都有自己的虚拟环境

如何在测试之前激活每个虚拟环境,并在测试之后将其停用

i、 e.我想这样做(伪代码):

激活() 在虚拟环境中,有
/bin/activate\u this.py

这正是我想要的。所以在
go.py
中我说

import os
activate_this_file = os.path.join(env_dir,'bin/deactivate_this.py')
execfile(activate_this_file, dict(__file__=activate_this_file))
运行测试() 我目前正在使用
run\u test()
工作

suite_x = TestLoader().loadTestsFromName(test_module + ":" + test_class)
r = run(suite = suite_x, argv = [sys.argv[0], "--verbosity=0", "-s"])
使停止工作 这是我无法理解的部分

禁用此.py的等效于
env/bin/activate\u this.py

更广泛的背景 每个模块将通过
go.py
作为lambda函数上传到AWS。(其中“lambda函数”在AWS上下文中具有特定含义,与
lambda x:foo(x)
)无关)


我希望
go.py
在每个lambda函数的各自虚拟环境中运行单元测试(因为一旦部署到AWS,它们将在这些虚拟环境中执行)。每个lambda函数使用不同的库,因此它们具有不同的虚拟Env.< /P> < P> <代码> ActudiaType。Py < /Cord>脚本不用于在计算过程中切换虚拟环境。它意味着在您的过程开始时尽快使用,并且不再被触摸。如果你看一下脚本的内容,你会发现它没有注意记录任何内容以备将来停用。一旦
activate\u this.py
脚本完成,解释器在脚本启动前的状态将丢失。此外,文件还包括(添加了重点):

此外,这无法撤消其他环境或已导入模块的激活。例如,您不应该尝试在web请求之前激活环境您应该尽早激活一个环境,在此过程中不要再激活它


与您希望使用的方法不同,我希望orchestrator生成特定于需要使用的虚拟环境的python解释器(带有
子流程
),并将测试运行程序传递给它(“nosetests”)有了所需的参数,它才能找到在该环境中运行所需的测试。

没有一种简单、完整、通用的方法可以做到这一点。原因是activate_this.py不仅修改了模块搜索路径,而且还修改了模块搜索路径,这可能与python过程相同。相比之下,activate的shell脚本版本只是修改环境变量,并让每个python进程自己重新执行站点自定义,因此清理要容易得多

如何解决这个问题?有几种可能性:

  • 您可能希望在下运行测试。这是我认为最可取的解决方案

  • 如果您确定virtualenv中没有任何包具有不可逆的sitecustomize/usercustomize,则可以编写一个deactivate(),用于撤消virtualenv对sys.path、os.environ和sys.prefix的修改,或者编写一个在activate()中记住这些值的deactivate(),以便deactivate()可以撤消它们

  • 您可以在
    execfile(“activate\u this.py”)
    之前或在
    activate()
    中激活。要停用虚拟环境,只需返回父进程。您必须弄清楚子进程如何返回测试结果,以便父进程/主进程能够编译最终的测试报告

  • suite_x = TestLoader().loadTestsFromName(test_module + ":" + test_class)
    r = run(suite = suite_x, argv = [sys.argv[0], "--verbosity=0", "-s"])