mac下Python關(guān)于venv 的使用

參考

廖雪峰 virtualenv
Python 項(xiàng)目管理的利器:虛擬環(huán)境 venv 的使用

環(huán)境

  • Mac

Python環(huán)境

virtualenv 用于解決環(huán)境依賴而存在凿可,通過(guò) virtualenv 命令可以生成項(xiàng)目的獨(dú)立依賴環(huán)境佣赖。
如果本地有多個(gè)版本的Python毕箍,需要對(duì)不同版本的Python單獨(dú)安裝virtualenv

不清楚管理多個(gè)版本Python的,可以參考我的另一篇Mac管理多版本Python

安裝virtualenv

不久之前,重裝了系統(tǒng)雕什,發(fā)現(xiàn)system下的Python(系統(tǒng)自帶的版本)默認(rèn)沒(méi)有安裝pip

wuxiaoxindeMac-mini:~ wuxiaoxin$ pyenv versions
* system (set by /Users/wuxiaoxin/.pyenv/version)
  3.7.4
wuxiaoxindeMac-mini:~ wuxiaoxin$ pip -V
pyenv: pip: command not found

The `pip' command exists in these Python versions:
  3.7.4

先安裝下pip,終端下執(zhí)行:

sudo easy_install pip

安裝完畢如下:

...
Installed /Library/Python/2.7/site-packages/pip-19.2.2-py2.7.egg
Processing dependencies for pip
Finished processing dependencies for pip

wuxiaoxindeMac-mini:~ wuxiaoxin$ pip -V
pip 19.2.2 from /Library/Python/2.7/site-packages/pip-19.2.2-py2.7.egg/pip (python 2.7)

安裝virtualenv

pip install virtualenv

出現(xiàn)這樣的警告:

DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7. More details about Python 2 support in pip, can be found at https://pip.pypa.io/en/latest/development/release-process/#python-2-support

說(shuō)是Python 2.7將于2020年1月1日結(jié)束它的生命显晶。贷岸。。
看來(lái)Python3大勢(shì)已定吧碾。

$ pip install virtualenv
Collecting virtualenv
  Using cached https://files.pythonhosted.org/packages/7e/1b/6c00d57127608793e16e8b7f813e64d58a1938505c42fe190d1386ab41e1/virtualenv-16.4.0-py2.py3-none-any.whl
Installing collected packages: virtualenv
Successfully installed virtualenv-16.4.0

如果出現(xiàn)這樣的錯(cuò)誤:

ERROR: Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python/2.7/site-packages/virtualenv.pyc'
Consider using the --user option or check the permissions.

應(yīng)該是權(quán)限問(wèn)題凰盔,根據(jù)提示加上--user試試。

pip install virtualenv --user

安裝成功:

Successfully installed virtualenv-16.7.2

查看當(dāng)前Python版本:system 倦春,已經(jīng)安裝的庫(kù):

pip list

$ pip list
Package                                Version 
-------------------------------------- --------
altgraph                               0.10.2  
bdist-mpkg                             0.5.0   
bonjour-py                             0.3     
macholib                               1.5.1   
matplotlib                             1.3.1   
modulegraph                            0.10.4  
numpy                                  1.8.0rc1
pip                                    19.2.2  
py2app                                 0.7.3   
pyobjc-core                            2.5.1   
pyobjc-framework-Accounts              2.5.1   
pyobjc-framework-AddressBook           2.5.1   
pyobjc-framework-AppleScriptKit        2.5.1   
pyobjc-framework-AppleScriptObjC       2.5.1   
pyobjc-framework-Automator             2.5.1   
pyobjc-framework-CFNetwork             2.5.1   
pyobjc-framework-Cocoa                 2.5.1   
pyobjc-framework-Collaboration         2.5.1   
pyobjc-framework-CoreData              2.5.1   
pyobjc-framework-CoreLocation          2.5.1   
pyobjc-framework-CoreText              2.5.1   
pyobjc-framework-DictionaryServices    2.5.1   
pyobjc-framework-EventKit              2.5.1   
pyobjc-framework-ExceptionHandling     2.5.1   
pyobjc-framework-FSEvents              2.5.1   
pyobjc-framework-InputMethodKit        2.5.1   
pyobjc-framework-InstallerPlugins      2.5.1   
pyobjc-framework-InstantMessage        2.5.1   
pyobjc-framework-LatentSemanticMapping 2.5.1   
pyobjc-framework-LaunchServices        2.5.1   
pyobjc-framework-Message               2.5.1   
pyobjc-framework-OpenDirectory         2.5.1   
pyobjc-framework-PreferencePanes       2.5.1   
pyobjc-framework-PubSub                2.5.1   
pyobjc-framework-QTKit                 2.5.1   
pyobjc-framework-Quartz                2.5.1   
pyobjc-framework-ScreenSaver           2.5.1   
pyobjc-framework-ScriptingBridge       2.5.1   
pyobjc-framework-SearchKit             2.5.1   
pyobjc-framework-ServiceManagement     2.5.1   
pyobjc-framework-Social                2.5.1   
pyobjc-framework-SyncServices          2.5.1   
pyobjc-framework-SystemConfiguration   2.5.1   
pyobjc-framework-WebKit                2.5.1   
pyOpenSSL                              0.13.1  
pyparsing                              2.0.1   
python-dateutil                        1.5     
pytz                                   2013.7  
scipy                                  0.13.0b1
setuptools                             18.5    
six                                    1.4.1   
virtualenv                             16.7.2  
xattr                                  0.6.4

新建一個(gè)文件夾test户敬,test作為工程文件夾,在該文件夾中創(chuàng)建venv環(huán)境睁本。
使用virtualenv命令尿庐,可以自動(dòng)創(chuàng)建venv環(huán)境。

可以發(fā)現(xiàn)virtualenv已經(jīng)安裝呢堰,但是會(huì)提示無(wú)此命令:

wuxiaoxindeMac-mini:7 wuxiaoxin$ virtualenv --no-site-packages venv
-bash: virtualenv: command not found

可以再執(zhí)行一次安裝命令抄瑟,終端會(huì)提示virtualenv的安裝路徑:

pip install virtualenv
Requirement already satisfied: virtualenv in /Users/wuxiaoxin/Library/Python/2.7/lib/python/site-packages (16.7.2)

順著這條路徑
/Users/wuxiaoxin/Library/Python/2.7/lib/python/site-packages
可以找到virtualenv命令文件所在路徑
/Users/wuxiaoxin/Library/Python/2.7/bin/virtualenv
這個(gè)命令virtualenv可以成功執(zhí)行。至于為什么安裝后不會(huì)自動(dòng)設(shè)置環(huán)境變量枉疼,原因不詳皮假。

這時(shí)候有兩種方式可以嘗試下

  • 將命令所在路徑加載到 PATH
    可以通過(guò)修改.bash_profile文件來(lái)實(shí)現(xiàn),open ~/.bash_profile
export VIRTUALENV_PATH=/Users/wuxiaoxin/Library/Python/2.7/bin
export PATH=$VIRTUALENV_PATH:$PATH

重啟終端骂维,查看PATH惹资,發(fā)現(xiàn)路徑已經(jīng)成功加到PATH

wuxiaoxindeMac-mini:~ wuxiaoxin$ echo $PATH
/Users/wuxiaoxin/Library/Python/2.7/bin:/Users/wuxiaoxin/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

測(cè)試成功:

$ virtualenv
You must provide a DEST_DIR
Usage: virtualenv [OPTIONS] DEST_DIR

Options:
  --version             show program's version number and exit
... (此處省略后面內(nèi)容)
  • 設(shè)置命令的軟連接
    如果不通過(guò)修改.bash_profile達(dá)到設(shè)置PATH的話『焦耄可以直接設(shè)置軟連接褪测,其實(shí)就是將命令拷貝一個(gè)替身到/usr/local/bin下。

ln –s 源文件 目標(biāo)文件

ln -s /Users/wuxiaoxin/Library/Python/2.7/bin/virtualenv /usr/local/bin/virtualenv

這里其實(shí)不需要考慮Python版本問(wèn)題潦刃,virtualenv命令已經(jīng)限定了Python版本侮措。
如果你將.bash_profile中關(guān)于virtualenv的路徑設(shè)置注釋掉,重啟終端乖杠,再執(zhí)行virtualenv分扎,會(huì)發(fā)現(xiàn):

wuxiaoxindeMac-mini:~ wuxiaoxin$ pyenv versions
* system (set by /Users/wuxiaoxin/.pyenv/version)
  3.7.4
wuxiaoxindeMac-mini:~ wuxiaoxin$ virtualenv
pyenv: virtualenv: command not found

The `virtualenv' command exists in these Python versions:
  3.7.4
wuxiaoxindeMac-mini:~ wuxiaoxin$ pyenv global 3.7.4
wuxiaoxindeMac-mini:~ wuxiaoxin$ python -V
Python 3.7.4
wuxiaoxindeMac-mini:~ wuxiaoxin$ virtualenv
You must provide a DEST_DIR
Usage: virtualenv [OPTIONS] DEST_DIR

Options:
  --version             show program's version number and exit
...(此處省略后面內(nèi)容)

現(xiàn)在可以正常使用了:

wuxiaoxindeMac-mini:test wuxiaoxin$ virtualenv --no-site-packages venv
New python executable in /Users/wuxiaoxin/Desktop/test/venv/bin/python
Installing setuptools, pip, wheel...
done.
test項(xiàng)目獨(dú)立依賴環(huán)境

加上了參數(shù)--no-site-packages,這樣胧洒,已經(jīng)安裝到系統(tǒng)Python環(huán)境中的所有第三方包都不會(huì)復(fù)制過(guò)來(lái)畏吓,這樣环揽,我們就得到了一個(gè)不帶任何第三方包的“干凈”的Python運(yùn)行環(huán)境。

實(shí)測(cè)不加這么個(gè)參數(shù)庵佣,直接執(zhí)行virtualenv venv也是一樣的效果呢。
如何知道汛兜?啟動(dòng)該虛擬環(huán)境巴粪,在該環(huán)境下pip list即可一目了然。
比如我的一個(gè)虛擬環(huán)境安裝在這個(gè)路徑下:
/Users/vampire/Desktop/test3/venv
那么可以這樣啟動(dòng)虛擬環(huán)境:

source /Users/vampire/Desktop/test3/venv/bin/activate

如圖粥谬,已經(jīng)啟動(dòng)虛擬環(huán)境:


已經(jīng)進(jìn)入虛擬環(huán)境.jpg

如下肛根,test3中使用參數(shù)--no-site-packages,test4中不使用參數(shù)--no-site-packages漏策,實(shí)測(cè)可以看出派哲,--no-site-packages參數(shù)加上和不加上,效果一樣:

效果一樣.jpg

只有一種可能掺喻,--no-site-packages是默認(rèn)參數(shù)芭届。
終端下執(zhí)行virtualenv可以看到:

果然--no-site-packages是默認(rèn)參數(shù).jpg

那么 --system-site-packages 就是它的對(duì)立參數(shù)了,測(cè)試下:

全局依賴參數(shù).jpg

可以看到感耙,安裝在系統(tǒng)的Python環(huán)境中的庫(kù)褂乍,也復(fù)制到這個(gè)虛擬環(huán)境中來(lái)了。

還需要注意的是這個(gè)參數(shù):

-p PYTHON_EXE, --python=PYTHON_EXE
The Python interpreter to use, e.g.,
--python=python3.5 will use the python3.5 interpreter
to create the new environment. The default is the
interpreter that virtualenv was installed with
(/usr/bin/python)

可以看出即硼,執(zhí)行virtualenv命令生成的虛擬環(huán)境逃片,默認(rèn)是依據(jù)
/usr/bin/python目錄下的Python環(huán)境。其實(shí)也就是當(dāng)前安裝virtualenv所屬的Python的版本只酥。

當(dāng)前電腦下有兩個(gè)Python環(huán)境:

wuxiaoxindeMac-mini:test1 wuxiaoxin$ pyenv versions
* system (set by /Users/wuxiaoxin/.pyenv/version)
  3.7.4

如果這樣執(zhí)行命令褥实,會(huì)怎樣?

wuxiaoxindeMac-mini:test1 wuxiaoxin$ virtualenv  --python=python3.7 venv
Running virtualenv with interpreter /Users/wuxiaoxin/.pyenv/shims/python3.7
pyenv: python3.7: command not found

The `python3.7' command exists in these Python versions:
  3.7.4

如果是這樣限制的話裂允,需要?jiǎng)?chuàng)建源自python3.7.4版本的依賴環(huán)境损离,直接使用pyenv進(jìn)行切換即可,virtualenv不需要帶這個(gè)參數(shù)--python了叫胖。

終端下進(jìn)入和退出venv虛擬環(huán)境:

假設(shè)一個(gè)新的venv虛擬環(huán)境所在的目錄如下:
/Users/vampire/Desktop/test/venv
venv目錄中包含如下文件夾:

  • bin
  • include
  • lib
    而該入口文件正是處于bin文件中的activate文件草冈,那么進(jìn)入虛擬環(huán)境的命令如下:
source /Users/vampire/Desktop/test/venv/bin/activate

退出虛擬環(huán)境的命令:

deactivate #這個(gè)是全局的命令,任何路徑下執(zhí)行都行

venv環(huán)境下安裝庫(kù)

終端下先進(jìn)入該venv環(huán)境瓮增,再執(zhí)行pip install 安裝怎棱。

venv下安裝庫(kù).png

關(guān)于 venv 移動(dòng)位置

一般我們使用virtualenv的目的是為了讓一個(gè)工程擁有獨(dú)立的依賴環(huán)境。
我們會(huì)把virtualenv生成的環(huán)境venv放置在工程路徑下绷跑。
如果我們移動(dòng)了這個(gè)工程的路徑拳恋,venv路徑也會(huì)隨之改變,因此注意修改這個(gè)命令文件
activate砸捏,打開(kāi)這個(gè)文件谬运,你會(huì)發(fā)現(xiàn)其實(shí)就是bash shell腳本隙赁,該命令的路徑也固定寫(xiě)在其中:

venv路徑

因此一旦移動(dòng)venv,記得修改venv/bin/activate文件中的路徑梆暖。如果是復(fù)制了venv伞访,也需要對(duì)復(fù)制venvvenv/bin/activate文件中的路徑,原venv/bin/activate保持不變轰驳。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厚掷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子级解,更是在濱河造成了極大的恐慌冒黑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勤哗,死亡現(xiàn)場(chǎng)離奇詭異抡爹,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)芒划,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)冬竟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人民逼,你說(shuō)我怎么就攤上這事诱咏。” “怎么了缴挖?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵袋狞,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我映屋,道長(zhǎng)苟鸯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任棚点,我火速辦了婚禮早处,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘫析。我一直安慰自己砌梆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開(kāi)白布贬循。 她就那樣靜靜地躺著咸包,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杖虾。 梳的紋絲不亂的頭發(fā)上烂瘫,一...
    開(kāi)封第一講書(shū)人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音奇适,去河邊找鬼坟比。 笑死芦鳍,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的葛账。 我是一名探鬼主播柠衅,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼籍琳!你這毒婦竟也來(lái)了茄茁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤巩割,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后付燥,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宣谈,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年键科,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了闻丑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡勋颖,死狀恐怖嗦嗡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饭玲,我是刑警寧澤侥祭,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站茄厘,受9級(jí)特大地震影響矮冬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜次哈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一胎署、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窑滞,春花似錦琼牧、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至此改,卻和暖如春抱究,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带斑。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工鼓寺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勋拟,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓妈候,卻偏偏與公主長(zhǎng)得像敢靡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苦银,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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