如何解決Python包依賴問題

2021-09-11 16:38:57 字數 3736 閱讀 3307

以簡潔高效(指程式設計較為高效, 而不是執行速度)出名的python, 在包依賴問題上有時候讓人撓頭.

一些新手複製了github上的專案準備執行, 很多時候會在包依賴這一步上卡個半天.(這裡推薦新手最好在基於linux的系統或者mac上, 一些包[比如scrapy的win32相關依賴]可能無法直接通過包管理工具安裝, 會讓新手從入門到放棄). 其他涉及到專案需要到其他機器部署時, 也會遇到包依賴問題.

# 這可能是部署過程中最常見的錯誤

modulenotfounderror: no module named '***'

pip freeze > requirements.txt
這個命令可能是很多同學用來輸出依賴的命令, 但它輸出的是當前環境下(

筆者預設你使用的是python的虛擬環境)的所有包, 也就是輸出當前你安裝的全部非python標準庫包)

筆者在自己終端上試了一下, 輸出的檔案如下: (這裡暴露了我沒有按專案建虛擬環境的爛習慣(逃)

# 省略n個庫

....

django==1.11.8

django-mongonaut==0.2.21

docopt==0.6.2

flask==0.10.1

flask-bootstrap==3.0.3.1

flask-login==0.3.1

flask-mail==0.9.0

flask-migrate==1.1.0

flask-moment==0.2.1

flask-pagedown==0.1.4

flask-script==0.6.6

flask-sqlalchemy==1.0

flask-wtf==0.9.4

forgerypy==0.1

html5lib==1.0b3

hyperlink==17.3.1

idna==2.6

incremental==17.5.0

itsdangerous==0.23

jinja2==2.7.1

lxml==4.1.1

mako==0.9.1

markdown==2.3.1

markupsafe==0.18

mongoengine==0.9.0

numpy==1.14.0

pandas==0.22.0

parsel==1.3.1

pdfkit==0.6.1

pipreqs==0.4.9

pyasn1==0.4.2

pyasn1-modules==0.2.1

pycparser==2.18

pydispatcher==2.0.5

pymongo==2.8

pymysql==0.7.9

pyopenssl==17.5.0

python-dateutil==2.6.1

pytz==2017.3

queuelib==1.4.2

requests==2.18.4

requests-file==1.4.3

scrape==0.9.12

scrapy==1.5.0

...# 省略n+1個庫

對於按專案建環境的同學, 這種輸出方式是沒有多大問題的

只要部署的時候在終端鍵入pip install -r requirements.txt就可以安裝好依賴了, 但是對於沒有嚴格區分專案環境的同學, 一次性安裝了其他的包, 並不是乙個好的解決方案.

如這個庫的名稱所示, 就是為了方便管理依賴而生.

與pip直接匯出全部不同, pipreqs只匯出指定專案下python檔案import的庫

用法如下

# 安裝

pip install pipreqs

# 切換到專案目錄

# 輸出requirements.txt到專案根目錄下

pipreqs --use-local ./

這裡我切換到乙個django專案目錄下, 開啟requirements.txt, 內容是:

pandas==0.22.0

django_debug_*******.egg==info

mongoengine==0.9.0

django==1.11.8

瞬間清爽不少.

pipenv, 匯集了pip,pipfile和virtualenv的功能,是乙個強大的命令列工具。

這裡展示最簡單的用法

pip install pipenv安裝好庫.

切換到專案根目錄

終端鍵入pipenv install

如果你尚未建立requirements.txt那麼將會得到乙個空白的pipfile文字檔案, 此時我們在命令列中使用pipenv install 包名, 會在pipefile寫入對應包資訊, 之後使用者要安裝依賴時, 使用pipenv install即可.

如果你已經建立, 終端上會輸出以下資訊:

requirements.txt found, instead of pipfile! converting…

warning: your pipfile now contains pinned versions, if your requirements.txt did.

we recommend updating your pipfile to specify the "*" version, instead.

...

上面的輸出意思是: 找到了requirements.txt, 但不是pipfile, 正在轉換...

pipefile現在將包含固定版本資訊, 如果你的requirements.txt中已包含.

我們推薦公升級你的pipefile到指定版本...

輸出pipenv檔案, 得到以下內容:

[[source]]

url = ""

verify_ssl = true

name = "pypi"

[packages]

mongoengine = "==0.9.0"

"django-debug-*******.egg" = "==info"

django = "==1.11.8"

pandas = "==0.22.0"

[dev-packages]

[requires]

python_version = "3.6"

可以清楚的看到整個檔案結構, 第乙個是[source]是安裝庫所在源, 第二個是依賴庫的資訊, 第三個是當你開發環境所需要的包, 最後乙個是python版本.

當你需要區分開發環境和正式版本發布環境時, 可以使用以下命令:

pipenv install --dev 包名
如果正式版本發布時, 鍵入pipenv install, 將不會安裝dev標記的包

除非其他開發人員鍵入pipenv install -dev, 才會安裝所有包.

Spring如何解決迴圈依賴問題

迴圈依賴問題在spring中主要有三種情況 1 通過構造方法進行依賴注入時產生的迴圈依賴問題。2 通過setter方法進行依賴注入且是在多例 原型 模式下產生的迴圈依賴問題。3 通過setter方法進行依賴注入且是在單例模式下產生的迴圈依賴問題。在spring中,只有第 3 種方式的迴圈依賴問題被解...

spring之迴圈依賴問題如何解決

首先,spring是支援迴圈依賴的。但是迴圈依賴並不好。最近,我在使用jenkins自動化部署,測試打出來的jar包,出現了迴圈依賴的問題。在這裡說一下,我解決問題的過程 我首先根據提示找到迴圈依賴的那幾個類,然後就是想辦法不讓他們迴圈依賴。什麼是迴圈依賴?就是a依賴b,b又依賴於a,結果sprin...

Spring如何解決迴圈依賴

比如 在a類引入b物件,在b類引入a物件,建立a的時候需要依賴b,建立b的時候需要依賴a,而各自建立物件的時候,其互相依賴的物件還沒有建立完成,就導致各自都無法成功建立物件。這就是迴圈依賴。class aclass b解決迴圈依賴的方法很簡單,如下所示,先例項化a和b,此時都沒初始化,即都沒有對各自...