[英]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.