我正在尝试对现有的python模块进行更改,然后在本地对其进行测试。最好的方法是什么?
我克隆了github模块并进行了更改,但是我不确定如何导入本地软件包而不是已经安装的软件包。
答案 0 :(得分:6)
进行此类测试的最简单方法是创建虚拟环境,然后将软件包安装在development mode中。
假设您使用的是Linux,则看起来像这样。
$ virtualenv dev_env
$ source dev_env/bin/activate
$ cd ~/project_folder
$ pip install -e .
此工作流程不会覆盖系统上已经安装的软件包。其他甚至更简单的选择可能只是使用PyCharm之类的IDE来为您处理大部分此类事情。
答案 1 :(得分:5)
您可以:
我建议您阅读this article,其中介绍了非常好的模块和软件包。
您需要使用与所需模块/软件包相同的名称来创建模块或软件包(没有区别),并将其放置在与将要使用的模块/软件包相同的文件夹中。
这是因为从sys.path
变量(其中第一个元素是脚本的目录)开始搜索模块
import platform
print(platform.system())
def system():
"""Just a docstring passing by"""
return "We have just overwritten default 'platform' module...\nFeel the force!"
如果您的项目更复杂,则更好的选择。
从软件包的根目录(启动构建的位置):
pip install -e ./
现在您可以编辑代码并实时查看更改。
它将python安装中的链接(实际上是* .pth文件)链接到您的代码,以便安装您的软件包,但任何更改将立即生效。
这样,您所有的测试代码和客户端代码等都可以按常规方式导入您的软件包。
没有sys.path黑客入侵
答案 2 :(得分:3)
一种方法是使用sys.path()。
例如:
import sys
sys.path.insert(0, path/to/module)
通过这种方式,您在查找模块时会优先使用特定路径。
这意味着将首先在path/to/module
中搜索要导入的模块,然后在sys.path
中已经存在的其他目录中搜索。
此方法的优点在于,此新订单将仅保留在脚本中,而不会更改其他脚本的导入顺序。
注意:出于开发目的,您应该使用@eandersson建议的virtualenv。
答案 3 :(得分:2)
您可能应该在virtual environment中完成大部分开发工作。您的工作流程可能如下:
# activate the virtual environment in ~/vpy
. $HOME/vpy/bin/activate
# install my app and its dependencies
cd $HOME/src/myapp
pip install -e .
# use my forked library instead
cd $HOME/src/forkedlib
pip install -e .
pytest # or whatever tests the forked lib has
# try it out with my application too
cd $HOME/src/myapp
pytest # or whatever tests your app has
myapp
pip install -e
起到了神奇的作用,因此,每当您import
在库中的模块时,它都会直接路由到检出的源树,因此,如果您在forkedlib
中进行编辑然后重新运行myapp
,您将直接看到这些更改。
完成后,您可以pip uninstall forkedlib
,然后重新运行pip install -e .
以重新安装应用程序的(声明的)依赖项。 (或者,如果更简单,则删除并重新创建虚拟环境。)
答案 4 :(得分:0)
answer by abc将模块路径添加到系统路径的方法适用于本地即时测试,但这不是完整的解决方案,例如当需要编译C代码或必须使用命令行挂钩时组。为了进行全面测试,您可能需要安装软件包。
典型的Python具有setup.py
,可以打包到分发文件(wheel,...)中,然后可以从本地文件本地安装。
工作流程为:
python setup.py bdist_wheel
之类的命令)pip install --no-index --find-links=..
一样简单)这将导致该软件包的每个将来的用户都会发现完全相同的情况,并且是一个完整的测试(包括安装过程),但是这也需要很多工作,这就是为什么我通常只使用系统路径方法在开发过程中,但是完整的安装方式仅在发布之前。