參考
廖雪峰 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.
加上了參數(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)境:
如下肛根,test3中使用參數(shù)--no-site-packages
,test4中不使用參數(shù)--no-site-packages
漏策,實(shí)測(cè)可以看出派哲,--no-site-packages
參數(shù)加上和不加上,效果一樣:
只有一種可能掺喻,--no-site-packages
是默認(rèn)參數(shù)芭届。
終端下執(zhí)行virtualenv可以看到:
那么 --system-site-packages
就是它的對(duì)立參數(shù)了,測(cè)試下:
可以看到感耙,安裝在系統(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
安裝怎棱。
關(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ě)在其中:
因此一旦移動(dòng)
venv
,記得修改venv/bin/activate
文件中的路徑梆暖。如果是復(fù)制了venv
伞访,也需要對(duì)復(fù)制venv
的venv/bin/activate
文件中的路徑,原venv/bin/activate
保持不變轰驳。