python利器——pipenv和pyenv介紹

也可以看我CSDN的博客:
https://blog.csdn.net/u013332124/article/details/90049921

在寫python程序時(shí),經(jīng)常會(huì)被版本管理以及第三方包管理搞的很頭疼街立。這兩天看了業(yè)內(nèi)相關(guān)的解決方案嚣镜,覺的很不錯(cuò)享怀。

一、pyenv

我們經(jīng)常在開發(fā)時(shí)會(huì)需要用到多個(gè)python版本,為了解決版本問題柬帕,比較常見的做法是修改環(huán)境變量來切換版本,但是修改環(huán)境變量終究比較麻煩狡门。另外陷寝,我們?cè)诎惭b新的python版本時(shí)也會(huì)小心翼翼,避免影響到系統(tǒng)自帶的python版本融撞。這個(gè)問題都可以通過pyenv來解決盼铁。

pyenv可以在系統(tǒng)中安裝多個(gè)python版本,并且不影響到系統(tǒng)自帶的python尝偎,而且通過pyenv我們可以快速的在多個(gè)python版本之間來回切換饶火。

安裝pyenv之前需要保證電腦上已經(jīng)安裝了git:

git clone git://github.com/yyuu/pyenv.git ~/.pyenv
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
exec $SHELL -l

安裝好了之后,使用很簡(jiǎn)單致扯,比如我們要安裝python3.7.3的版本肤寝,可以直接通過pyenv安裝

pyenv install 3.7.3

3.7版本需要一個(gè)新的包libffi-devel,如果安裝過程中報(bào)ModuleNotFoundError: No module named '_ctypes'抖僵,可以安裝一下這個(gè)包鲤看。 yum install libffi-devel -y

之后可以通過以下命令快速切換python命令

pyenv global 3.7.3

其實(shí)pyenv的原理也很簡(jiǎn)單,就是對(duì)python版本進(jìn)行統(tǒng)一管理耍群,之后也是通過修改環(huán)境變量來切換python命令的指向义桂。但是通過pyenv我們只要執(zhí)行一個(gè)命令就可以了找筝,我們可以看到所有通過pyenv安裝的python版本都放在~/.pyenv/versions目錄下,也更加方便管理

pyenv which python
# ~/.pyenv/versions/3.7.3/bin/python

pyenv 支持的參數(shù)也比較少:

Some useful pyenv commands are:
   commands    List all available pyenv commands
   local       Set or show the local application-specific Python version
   global      Set or show the global Python version
   shell       Set or show the shell-specific Python version
   install     Install a Python version using python-build
   uninstall   Uninstall a specific Python version
   rehash      Rehash pyenv shims (run this after installing executables)
   version     Show the current Python version and its origin
   versions    List all Python versions available to pyenv
   which       Display the full path to an executable
   whence      List all Python versions that contain the given executable

shell表示切換的版本僅當(dāng)前版本有效,session關(guān)閉后就失效了

global表示全局,重啟也不會(huì)影響更改

local表示臨時(shí)生效慷吊,但是系統(tǒng)重啟后就不會(huì)生效了

二袖裕、pipenv

pyenv雖然解決了python版本切換的問題,但是依舊無法解決各個(gè)項(xiàng)目的第三方包管理的問題溉瓶。比如說A項(xiàng)目需要用requests版本是1.0急鳄,而B項(xiàng)目需要requests版本是2.0。這時(shí)候pipenv就派上用場(chǎng)了堰酿。值得一提的是疾宏,pipenv也是寫requests的那位大佬寫的。

pipenv可以為我們的項(xiàng)目自動(dòng)創(chuàng)建和管理一個(gè)虛擬環(huán)境触创。并且會(huì)在項(xiàng)目目錄下創(chuàng)建一個(gè)Pipfile來管理第三方包坎藐。

pipenv的安裝很簡(jiǎn)單:

# 可以用pyenv先安裝一下python3
pip3 install pipenv

使用也很簡(jiǎn)單,進(jìn)入項(xiàng)目目錄后嗅榕,使用以下任一命令創(chuàng)建一個(gè)虛擬環(huán)境:

# 基于python3創(chuàng)建一個(gè)虛擬環(huán)境
pipenv --three
# 或者基于python2創(chuàng)建一個(gè)虛擬環(huán)境
pipenv --two
# 也可以指定版本創(chuàng)建
pipenv --python 3.6

注意顺饮,pipenv指定python版本時(shí)必須保證機(jī)器上已經(jīng)安裝了那個(gè)版本的python了。這個(gè)可以用pyenv安裝

創(chuàng)建成功后會(huì)在項(xiàng)目目錄下生產(chǎn)一個(gè)Pipfile文件來管理第三方包凌那。之后可以通過以下命令安裝requests

pipenv install requests

這樣requests的安裝只對(duì)當(dāng)前項(xiàng)目生效兼雄。之后可以通過以下命令進(jìn)行虛擬環(huán)境運(yùn)行相關(guān)腳本:

pipenv shell

或者通過以下命令直接使用虛擬環(huán)境運(yùn)行命令:

pipenv run python xxx.py

pipenv的原理也很簡(jiǎn)單,我們輸入pipenv -venv就可以得到虛擬環(huán)境的目錄帽蝶。然后在執(zhí)行pipenv shell時(shí)赦肋,會(huì)看到以下輸出語句:

. ~/.local/share/virtualenvs/monitor-9E5KrdNU/bin/activate

其實(shí)就是激活虛擬環(huán)境的activate,設(shè)置一下相關(guān)環(huán)境變量励稳。通過pipenv安裝的第三方包也都在~/.local/share/virtualenvs/monitor-9E5KrdNU/lib目錄下佃乘。

雖然pipenv還有很多強(qiáng)大的地方,但是對(duì)于就偶爾寫寫python代碼的我來說驹尼,上面的這些就足夠用了趣避,因此這里不多做介紹。感興趣的可以看參考資料里面的幾篇博客

三新翎、virtualenv

有了pipenv后程帕,其實(shí)virtualenv已經(jīng)沒什么用了。但是也有人在線上部署的時(shí)候結(jié)合virtualenv和pipenv來部署地啰,因此這里做個(gè)簡(jiǎn)單的介紹愁拭。

安裝virtualenv也很簡(jiǎn)單:

pip install virtualenv

之后創(chuàng)建一個(gè)虛擬環(huán)境:

# 通過-p可以指定要?jiǎng)?chuàng)建的虛擬環(huán)境的python執(zhí)行文件
virtualenv -p /usr/local/python venv

其實(shí)就是創(chuàng)建了一個(gè)venv的目錄,這個(gè)目錄下有bin亏吝、lib岭埠、include,其中通過虛擬環(huán)境安裝的第三方包都會(huì)放在lib下。

通過以下命令進(jìn)入虛擬環(huán)境:

source bin/activate

和pipenv基本一樣惜论,就是通過activate設(shè)置了環(huán)境變量许赃。

之后通過deactivate退出虛擬環(huán)境,其實(shí)就是恢復(fù)了環(huán)境變量来涨。

四图焰、線上部署

使用pipenv在本地開發(fā)好后启盛,總要部署到線上蹦掐。如果線上也能直接安裝pipenv固然最好,但是不好在服務(wù)器安裝pipenv的情況僵闯,怎么辦呢卧抗?

1、如果線上使用的是virtualenv管理虛擬環(huán)境的話

可以直接在virtualenv的虛擬環(huán)境中安裝pipenv鳖粟,這樣就可以直接運(yùn)行我們基于pipenv構(gòu)建的項(xiàng)目了

# 創(chuàng)建虛擬環(huán)境
python3 -m virtualenv .venv
# 用虛擬環(huán)境的pip安裝pipenv
.venv/bin/python -m pip install -U pip pipenv
# 通過虛擬環(huán)境的pipenv安裝第三方包
.venv/bin/pipenv install --dev --deploy

2社裆、 如果線上連virtualenv都沒有的話

通過pipenv導(dǎo)出requirements.txt,然后到線上安裝第三方包

# 本地執(zhí)行向图,然后導(dǎo)到線上
pipenv run pip freeze > requirements.txt

# 服務(wù)器安裝第三方包
python -m pip -r requirements.txt

參考資料

pipenv介紹

pyenv介紹

virtualenv介紹

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末泳秀,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子榄攀,更是在濱河造成了極大的恐慌嗜傅,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件檩赢,死亡現(xiàn)場(chǎng)離奇詭異吕嘀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)贞瞒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門偶房,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人军浆,你說我怎么就攤上這事棕洋。” “怎么了乒融?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵掰盘,是天一觀的道長。 經(jīng)常有香客問我簇抵,道長庆杜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任碟摆,我火速辦了婚禮晃财,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己断盛,他們只是感情好罗洗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钢猛,像睡著了一般伙菜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上命迈,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天贩绕,我揣著相機(jī)與錄音,去河邊找鬼壶愤。 笑死淑倾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的征椒。 我是一名探鬼主播娇哆,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼勃救!你這毒婦竟也來了碍讨?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤蒙秒,失蹤者是張志新(化名)和其女友劉穎勃黍,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體税肪,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溉躲,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了益兄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锻梳。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖净捅,靈堂內(nèi)的尸體忽然破棺而出疑枯,到底是詐尸還是另有隱情,我是刑警寧澤蛔六,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布荆永,位于F島的核電站,受9級(jí)特大地震影響国章,放射性物質(zhì)發(fā)生泄漏具钥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一液兽、第九天 我趴在偏房一處隱蔽的房頂上張望骂删。 院中可真熱鬧,春花似錦、人聲如沸宁玫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽欧瘪。三九已至眷射,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間佛掖,已是汗流浹背妖碉。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留苦囱,地道東北人嗅绸。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像撕彤,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子猛拴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容