我有一个Python库,其存储库结构如下:
repobase
|- mylibrary
| |- __init__.py
|- tests
|- test_mylibrary.py
到目前为止,运行测试只需要在仓库基础目录中调用py.test
即可。然后,在test_mylibrary.py中的import mylibrary
将使用repobase/mylibrary中的本地代码。
现在,我已经扩展了库以使用编译代码。因此,repobase/mylibrary中的源代码本身不起作用。我必须执行setup.py build
。这会创建repobase/build/lib.linux-x86_64-2.7/mylibrary。
有没有合理的方法使py.test使用该目录来导入mylibrary?考虑以下限制:
我不想在test_mylibrary.py中包含任何
sys.path
/import魔法,因为这可能会破坏其他环境中的测试。我不想放弃从repobase运行
py.test
的可能性。因此,修改PYTHONPATH无济于事,因为“。”仍将是sys.path
中的第一个项。因此,优先考虑repobase/mylibrary而不是repobase/build/lib.linux-x86_64-2.7/mylibrary。
如果没有,那么测试需要构建的Python库的标准方法是什么?
pickle
与cPickle
。如果是后者,则它们应该有不同的名称。常见的Python习惯用法是在编译部分前加下划线,例如Python的socket
与_socket
。 - Ayado_something(args)
的函数,它是用Python实现的。现在,Python实现已被替换为对某个编译后的c代码的内部调用。do_something
的API没有改变,我仍然想执行相同的测试。在进行测试之前,只需从“repobase/mylibrary”运行原始代码即可。更改后,这不再可行,因为原始Python代码不能再单独使用了。相反,我必须首先运行setup.py build
,然后使用来自“build”子目录中的代码。问题是如何让py.test使用该代码。 - Tim Hoffmann