gpt4 book ai didi

python-3.x - 在 py.test 测试中重新启动 python (或重新加载模块)

转载 作者:行者123 更新时间:2023-12-02 10:21:07 26 4
gpt4 key购买 nike

我有一个(python3)包,它具有完全不同的行为,具体取决于它的 init() 方式(也许不是最好的设计,但重写不是一个选项)。该模块只能 init() 一次,第二次会出错。我想使用 py.test 测试这个包(两种行为)。

注意:包的性质使这两种行为相互排斥,没有理由希望在一个程序中同时实现这两种行为。

我的测试目录中有多个 test_xxx.py 模块。每个模块都会按照需要的方式初始化包(使用固定装置)。由于 py.test 启动 python 解释器一次,因此在一次 py.test 运行中运行所有测试模块都会失败。

对包进行猴子修补以允许第二个 init() 不是我想要做的事情,因为存在内部缓存等可能会导致无法解释的行为。

  • 是否可以告诉 py.test 在单独的 python 进程中运行每个测试模块(从而不受另一个测试模块中的 init 的影响)
  • 有没有办法可靠地重新加载包(包括所有子依赖项等)?
  • 是否还有其他解决方案(我正在考虑导入然后取消导入固定装置中的包,但这似乎过多)?

最佳答案

要重新加载模块,请尝试使用库 importlib 中的 reload()

示例:

from importlib import reload
import some_lib
#do something
reload(some_lib)

此外,在新进程中启动每个测试是可行的,但多进程代码调试起来有点痛苦。

示例

import some_test
from multiprocessing import Manager, Process

#create new return value holder, in this case a list
manager = Manager()
return_value = manager.list()
#create new process
process = Process(target=some_test.some_function, args=(arg, return_value))
#execute process
process.start()
#finish and return process
process.join()
#you can now use your return value as if it were a normal list,
#as long as it was assigned in your subprocess

关于python-3.x - 在 py.test 测试中重新启动 python (或重新加载模块),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704684/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com