以簡潔高效(指程式設計較為高效, 而不是執行速度)出名的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,此時都沒初始化,即都沒有對各自...