簡體   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