如何在本地开发python包?

时间:2018-09-09 20:41:01

标签: python python-import

我正在尝试对现有的python模块进行更改,然后在本地对其进行测试。最好的方法是什么?

我克隆了github模块并进行了更改,但是我不确定如何导入本地软件包而不是已经安装的软件包。

5 个答案:

答案 0 :(得分:6)

进行此类测试的最简单方法是创建虚拟环境,然后将软件包安装在development mode中。

假设您使用的是Linux,则看起来像这样。

$ virtualenv dev_env
$ source dev_env/bin/activate
$ cd ~/project_folder
$ pip install -e .

此工作流程不会覆盖系统上已经安装的软件包。其他甚至更简单的选择可能只是使用PyCharm之类的IDE来为您处理大部分此类事情。

答案 1 :(得分:5)

TL; DR

您可以:

  • 覆盖模块,方法是在相同文件夹中创建另一个与相同名称的模块/程序包,作为您要运行的脚本。< / li>
  • 使用 develop mode

我建议您阅读this article,其中介绍了非常好的模块和软件包。


覆盖模块/软件包

说明

您需要使用与所需模块/软件包相同的名称来创建模块或软件包(没有区别),并将其放置在与将要使用的模块/软件包相同的文件夹中。

这是因为从sys.path变量(其中第一个元素是脚本的目录)开始搜索模块

示例

  1. 创建具有以下内容的脚本:
import platform

print(platform.system())
  1. 启动python your_test_script.py),它应该返回

    Output BEFORE

  2. 现在在先前测试脚本的相同目录精确创建一个名为 platform.py的文件,其中包含以下内容:

def system():
    """Just a docstring passing by"""
    return "We have just overwritten default 'platform' module...\nFeel the force!"
  1. 如果立即启动脚本,您会注意到输出有所不同:

    Output AFTER


开发模式

说明

如果您的项目更复杂,则更好的选择。

从软件包的根目录(启动构建的位置):

pip install -e ./ 

现在您可以编辑代码并实时查看更改。


来自The Joy of Packaging

它将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=..一样简单)
  • 运行测试

这将导致该软件包的每个将来的用户都会发现完全相同的情况,并且是一个完整的测试(包括安装过程),但是这也需要很多工作,这就是为什么我通常只使用系统路径方法在开发过程中,但是完整的安装方式仅在发布之前。