[英]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(或者特别是这个包)的实际源代码?
谢谢
修改到位是危险的。 修改源, 然后从修改后的版本安装它。
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上: https : py_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.