如何在本地开发python包?

Ale*_* Xu 11 python python-import

我正在尝试更改现有的python模块,然后在本地测试它.最好的方法是什么?

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

ean*_*son 10

进行此类测试的最简单方法是创建虚拟环境,然后以开发模式安装软件包。

假设您使用的是Linux,则外观如下所示。

$ virtualenv dev_env
$ source dev_env/bin/activate
$ cd ~/project_folder
$ pip install -e .
Run Code Online (Sandbox Code Playgroud)

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

  • 我如何在 pycharm 上做到这一点? (2认同)

Luk*_*ogs 7

TL; DR

你可以:

  • 通过在您将运行的脚本相同的文件夹中创建另一个具有相同名称的模块/包来覆盖模块/包。
  • 使用开发模式

我建议阅读这篇文章,它很好地解释了模块和包。


覆盖模块/包

描述

您需要使用与您想要的模块/包相同的名称创建一个模块或包(它没有区别),并将其放在与要使用它的脚本相同的文件夹中。

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

例子

  1. 创建一个包含以下内容的脚本:
import platform

print(platform.system())
Run Code Online (Sandbox Code Playgroud)
  1. 启动它 ( python your_test_script.py) 应该返回

    输出之前

  2. 现在在上一个测试脚本的同一目录创建一个完全 命名的文件platform.py,内容如下:

def system():
    """Just a docstring passing by"""
    return "We have just overwritten default 'platform' module...\nFeel the force!"
Run Code Online (Sandbox Code Playgroud)
  1. 如果您现在启动脚本,您会注意到输出不同:

    输出之后


开发模式

描述

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

从包的根目录(您将在其中启动构建):

pip install -e ./ 
Run Code Online (Sandbox Code Playgroud)

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


来自包装的乐趣

它将链接(实际上是 *.pth 文件)放入 python 安装到您的代码中,以便安装您的包,但任何更改都会立即生效。

这样,您的所有测试代码和客户端代码等都可以按照通常的方式导入您的包。

没有 sys.path 黑客攻击


abc*_*abc 5

一种方法是使用sys.path()
例如:

import sys
sys.path.insert(0, path/to/module)
Run Code Online (Sandbox Code Playgroud)

这样,您在查找模块时就会优先考虑特定路径。
这意味着将首先在 .txt 中的其他目录中搜索要导入的模块,path/to/module然后再搜索sys.path

这种方法的优点是,这个新顺序将仅保留在您的脚本内,而无需更改其他脚本的导入顺序。

注意:出于开发目的,您应该按照@eandersson的建议使用 virtualenv 。


Dav*_*aze 5

您可能应该在虚拟环境中完成大部分开发工作。您的工作流程可能如下所示:

# 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
Run Code Online (Sandbox Code Playgroud)

pip install -e做了一些魔法,这样,每当您import在库中使用模块时,它都会直接路由到签出的源代码树,因此如果您在 中进行编辑forkedlib然后重新运行myapp,您将直接看到这些更改。

完成后,您可以pip uninstall forkedlib重新运行pip install -e .以重新安装应用程序的(已声明的)依赖项。(或者删除并重新创建虚拟环境,如果这样更容易的话。)