繁体   English   中英

编辑 pip 安装的 package

[英]Edit package installed by pip

我正在尝试编辑通过 pip 安装的 package,称为 py_mysql2pgsql(将我的数据库从 mysql 转换为 postgre 时出错,就像这样

但是,当我到达文件夹 /user/local/lib/python2.7/dist-packages/py_mysql2pgsql-0.1.5.egg-info 时,我找不到 package 的源代码。 我只找到 PKG-INFO 和文本文件。

我怎样才能找到 package(或者特别是这个包)的实际源代码?

谢谢

TL; DR:

修改到位是危险的。 修改源, 然后从修改后的版本安装它。

细节

pip是一个管理软件包安装的工具。 您不应修改程序包安装期间创建的文件。 充其量,这样做意味着pip将相信特定版本的软件包安装时不会。 这与升级功能无法很好地互动。 我怀疑pip会覆盖你的自定义,永远丢弃它们,但我还没有确认。 另一种可能性是它检查文件是否已更改,如果是,则抛出错误。 (我认为这不太可能。)它还会误导系统的其他用户。 他们看到您安装了一个软件包,但实际上并没有指出该版本; 你有一个定制的版本。 如果他们尝试在其他地方安装未修改的版本,或者如果他们期望安装的版本有某些特定的行为,则可能会导致混淆。

如果要修改源代码,正确的做法是修改源代码并构建新的自定义包或仅从源代码安装。 py-mysql2pgsql提供了执行源安装的说明:

> git clone git://github.com/philipsoutham/py-mysql2pgsql.git
> cd py-mysql2pgsql
> python setup.py install

您可以克隆源,修改它,然后在不使用pip的情况下安装。 如果需要在内部重新分发,也可以构建自己的自定义版本的软件包。 这个项目使用setuptools来构建它的包,所以你只需要熟悉setuptools就可以使用它们的setup.py文件了。 确保以这种方式安装它不会在pip的包列表中创建任何误导性条目。 如果是,请找到确保条目更清晰的方法或找到替代安装方法。

既然你已经发现了软件中的一个错误,我也强烈建议你在Github上分配它并在修复后提交一个pull请求。 如果这样做,只需将存储库URL更改为fork即可使用上述安装说明。 如果您不分叉,至少提出问题并描述修复它的更改。

备择方案:

  • 您可以将所有源代码复制到项目中,在那里进行修改,然后将修改后的版本与其余代码一起分发。 (如果这样做,请确保不违反许可证。)
  • 您可以在运行时解决问题。 如果团队中的其他人可能不期望行为发生变化,那么对模块进行修补有点冒险,但可以对模块的行为进行全局修改。 您还可以创建一些包含错误代码的附加代码:它可以接受输入,调用错误代码,并防止或处理错误(例如,修改输入以使其工作或捕获异常并处理它等。 )。

只需打印出模块的.__file__属性:

>>> import numpy
>>> numpy.__file__
'/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/numpy/__init__.py'

显然路径和特定的包对你来说会有所不同,但这是跟踪python中任何模块的源文件的非常简单的方法。

py_mysql2pgsql包托管在PyPI上: httpspy_mysql2pgsql

如果你想要那个特定版本的代码,只需从PyPI下载源代码tarball(py-mysql2pgsql-0.1.5.tar.gz)

开发在GitHub上托管: https//github.com/philipsoutham/py-mysql2pgsql

您可以使用patch命令轻松修补 pip 软件包。

执行此操作时,为您修补的软件包指定准确的版本号很重要。

我建议使用Pipenv ,它会创建一个锁定文件,其中所有依赖项和子依赖项的所有版本都被锁定,以便始终安装相同版本的包。 它还管理您的虚拟环境,并方便使用此处描述的方法。

patch命令的第一个参数是要修补的文件。 所以这应该是 pip package 的模块,它可能在 virtualenv 中。

如果您使用 Pipenv,您可以使用pipenv --venv --venv 获取虚拟环境路径,因此您可以像这样修补requests package:

patch $(pipenv --venv)/lib/python3.6/site-packages/requests/api.py < requests-api.patch

requests.patch文件是一个差异文件,可能如下所示:

--- requests/api.py     2022-05-03 21:55:06.712305946 +0200
+++ requests/api_new.py 2022-05-03 21:54:57.002368710 +0200
@@ -54,6 +54,8 @@
       <Response [200]>
     """

+    print(f"Executing {method} request at {url}")
+
     # By using the 'with' statement we are sure the session is closed, thus we
     # avoid leaving sockets open which can trigger a ResourceWarning in some
     # cases, and look like a memory leak in others.

您可以像这样制作补丁文件:

diff -u requests/api.py requests/api_new.py > requests-api.patch

requests/api_new.py将是requests/api.py /api.py 的新更新版本。

diff命令的-u标志给出了统一的 diff 格式,以后可以使用patch命令来修补文件。

因此,这种方法可以用于自动化过程。 只需确保您已为您修补的模块指定了准确的版本号。 您不希望模块意外升级,因为您可能必须更新补丁文件。 因此,您还必须记住,如果您手动升级模块,您还要检查是否需要重新创建补丁文件,并在必要时这样做。 仅当您正在修补的文件已在 package 的新版本中更新时才需要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM