原文:https://blog.csdn.net/lovedingd/article/details/106721585
背景
問題1:
舉個例子,tensorflow(tf)是一個十分流行的python機器學習庫,你現在手里有兩個tf項目,其中項目A需要使用python2.7 + f1.2,項目B需要使用python2.7 + tf1.6.這兩個項目你得同時進行,怎么辦?
愚蠢的辦法是需要運行項目A時,將python2.7中的tf1.6卸載掉,安裝tf1.2;需要運行項目B時,將python2.7中的tf1.2卸載掉,安裝tf1.6。如果是單個模塊還好,但是tf的不同版本又依賴於python中的其他已安裝模塊,而且tf1.2和tf1.6對依賴模塊有不同的版本要求,那么轉換一次得卸載安裝好幾個模塊,是不是很爆炸?
問題2:
課題組里幾個同門共用一台服務器,每個人擁有一個系統賬戶,其中只有一個人擁有root權限,里面每個人都需要使用python跑程序,而且每個人對python版本以及python模塊的版本都有不同需求,很多人又沒有root權限,如何解決?
1. python虛擬環境
python虛擬環境是一個隔離/獨立的python開發環境,和系統python環境可以完全隔離,互不相關,相當於多了一個python開發環境。而且你在python虛擬環境中的開發過程和使用系統python一模一樣,你可以在你創建的python虛擬環境中使用pip工具安裝任何你需要的模塊,該模塊和系統python環境完全不相關。虛擬環境的這個特點就能解決上面的問題了。
1.1 安裝虛擬環境
python有3個模塊可以用於創建和管理python虛擬環境:
venv
virtualenv
pyvenv
其中,venv模塊是Python3.3之后標准庫自帶的虛擬環境創建和管理工具,在一定程度上能夠替代virtualenv。但venv是Python3.3才有的,Python2.X不能使用,而virtualenv同時支持Python2.X和Python3.X,特別是在當前的生產環境中Python2.X還占有很大比例的情況下我們依然需要virtualenv。
可以使用以下命令安裝:
#安裝venv
sudo apt install python3-venv
#安裝virtualenv
pip install virtualenv
或者
sudo -H pip install virtualenv
1
2
3
4
5
6
安裝好之后,就可以使用這兩個工具安裝python虛擬環境了。
注意:以上兩種安裝方式在安裝虛擬環境的同時也自動安裝了pip工具。
1.2 pyvenv腳本過時說明
在 *nix 系統上,可以直接執行 pyvenv /path/to/new/virtual/enviorment 來創建一個虛擬環境,在 Windows 系統上,則可以使用 python -m venv myenv 來創建。
pyvenv /path/to/new/virtual/environment
1
虛擬環境也能創建成功,但是會有一個warning。
盡管Python 3.7.3的bin目錄下依然有pyvenv的腳本,但是在打印的help信息的第一行明確警告說:這個腳本是過時的,推薦使用 python3.7 -m venv命令。
注:主要原因是避免混淆新創建的虛擬環境到底用的是哪個Python解釋器,使用python3.7 -m venv這個格式可以明確的指導使用的是當前調用的解釋器。
注:PEP 405對Python的虛擬環境有詳細說明。
[tony@tony-controller bin]$ ./pyvenv --help
WARNING: the pyenv script is deprecated in favour of `python3.7 -m venv`
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
[--upgrade] [--without-pip] [--prompt PROMPT]
ENV_DIR [ENV_DIR ...]
Creates virtual Python environments in one or more target directories.
1
2
3
4
5
6
7
1.3 使用virtualenv
我的系統python版本有python2.7和python3.5,虛擬環境的python版本只能是系統中已有的python版本。使用virtualenv安裝虛擬環境的命令如下:
#安裝python2.7虛擬環境
virtualenv /home/yan/env
1
2
什么參數都不指定的話,它會使用/usr/bin/python路徑下的python解釋器版本,即python2.7。因此會默認安裝python2.7虛擬環境,/home/yan/env表示虛擬環境的安裝路徑。
如果你要安裝的是python3.5的虛擬環境,可以這樣:
#安裝python3.5虛擬環境
virtualenv --python=python3.5 /home/yan/env3
1
2
一般情況下,上面兩條命令就夠了,這樣安裝得到的python虛擬環境和系統python環境是完全隔離的。
更多的命令選項可以在命令行中直接輸入virtualenv命令獲取。
1.4 使用venv
venv只有python3可以使用,因此只能創建python3的虛擬環境,創建命令如下:
python3 -m venv /home/yan/env3
1
其中,python3 -m venv是死命令,最后的安裝路徑自己指定。
venv命令的選項與pyvenv的選項一樣,可以一次性同時創建多個虛擬環境。
# 創建兩個虛擬環境
[tony@tony-controller bin]$ ./python3 -m venv /tmp/venv1_py37 /tmp/venv2_py37
# 查看虛擬環境目錄
[tony@tony-controller bin]$ ls -l /tmp/venv*
/tmp/venv1_py37:
total 4
drwxrwxr-x. 2 tony tony 173 Apr 28 09:43 bin
drwxrwxr-x. 2 tony tony 6 Apr 28 09:43 include
drwxrwxr-x. 3 tony tony 23 Apr 28 09:43 lib
lrwxrwxrwx. 1 tony tony 3 Apr 28 09:43 lib64 -> lib
-rw-rw-r--. 1 tony tony 84 Apr 28 09:43 pyvenv.cfg
/tmp/venv2_py37:
total 4
drwxrwxr-x. 2 tony tony 173 Apr 28 09:43 bin
drwxrwxr-x. 2 tony tony 6 Apr 28 09:43 include
drwxrwxr-x. 3 tony tony 23 Apr 28 09:43 lib
lrwxrwxrwx. 1 tony tony 3 Apr 28 09:43 lib64 -> lib
-rw-rw-r--. 1 tony tony 84 Apr 28 09:43 pyvenv.cfg
# 選項幫助信息
[tony@tony-controller bin]$ ./python3 -m venv --help
usage: venv [-h] [--system-site-packages] [--symlinks | --copies] [--clear]
[--upgrade] [--without-pip] [--prompt PROMPT]
ENV_DIR [ENV_DIR ...]
Creates virtual Python environments in one or more target directories.
positional arguments:
ENV_DIR A directory to create the environment in.
optional arguments:
-h, --help show this help message and exit
--system-site-packages
Give the virtual environment access to the system
site-packages dir.
--symlinks Try to use symlinks rather than copies, when symlinks
are not the default for the platform.
--copies Try to use copies rather than symlinks, even when
symlinks are the default for the platform.
--clear Delete the contents of the environment directory if it
already exists, before environment creation.
--upgrade Upgrade the environment directory to use this version
of Python, assuming Python has been upgraded in-place.
--without-pip Skips installing or upgrading pip in the virtual
environment (pip is bootstrapped by default)
--prompt PROMPT Provides an alternative prompt prefix for this
environment.
Once an environment has been created, you may wish to activate it, e.g. by
sourcing an activate script in its bin directory.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
2. 激活虛擬環境
安裝好虛擬環境之后,每次使用該虛擬環境前需要使用命令激活它。
2.1 linux下激活虛擬環境
假設前面我在/home/yan/env3/目錄下安裝了python3.5的虛擬環境,現在我使用source命令激活它:
source /home/yan/env3/bin/activate
1
激活之后,在命令行提示符前面會有(env3)的提示,表示當前你處的python虛擬環境,比如我電腦的情況:
yan@yanubuntu:~$ python3 -m venv /home/yan/env3
yan@yanubuntu:~$ source /home/yan/env3/bin/activate
(env3) yan@yanubuntu:~$
1
2
3
現在你可以在激活環境中干任何事情,比如使用pip命令在你新的python虛擬環境中安裝模塊:
pip install tensorflow
pip install opencv-python
pip install matplotlib
...
1
2
3
4
或者執行python腳本。
使用完該虛擬環境之后,你需要在命令行輸入deactivate命令來退出該虛擬環境:
(env3) yan@yanubuntu:~$ deactivate
yan@yanubuntu:~$
1
2
之后就回到了正常的系統python環境中。
2.2 windows下激活虛擬環境
以上為在linux激活虛擬環境的方法,在Windows上需要執行activate.bat文件,如在windows下創建的虛擬環境目錄為:C:\test\env,激活此虛擬環境需要找到Script文件夾下的activate.bat文件,如圖
執行命令:
激活后在命令行提示符前面會有(env)的提示,表示當前已經處在虛擬環境中
退出虛擬環境則執行deactivate.bat,如圖
2.3 刪除虛擬環境
由於你創建該虛擬環境的目的是為了跑某個項目的程序,現在該項目做完了,不需要該虛擬環境了,你可以把該虛擬環境直接刪除,如何刪?
直接將創建虛擬環境時生成的文件夾刪掉,就這么簡單。比如我要把我剛才創建的env3虛擬環境刪除:
yan@yanubuntu:~$ rm -r /home/yan/env3
yan@yanubuntu:~$
1
2
在刪除虛擬環境前記得一定得先退出該虛擬環境。
3. 在PyCharm中使用虛擬環境
有時候你都不知道自己在哪個python環境都裝了些什么模塊什么版本,但是在這里,你就可以很清晰的看到了,非常好用啊!原來我在PyCharm中沒運行起來django是因為我這個虛擬環境里還沒裝django,裝好以后就長下面這樣,運行起來就沒問題了!
怎么裝?看這里:
可視化界面就是好用啊,搜一搜就出來了,也不怕命令行里模塊名寫錯了
4.其他虛擬環境工具
為了解決包依賴、安裝權限和 python 版本問題,程序員們制造了許多工具。除了以上介紹的虛擬環境創建工具還有如下幾個,這里介紹的工具都是當前流行的,不會包含已經不再維護的工具。
virtualenvwrapper
顧名思義,virtualenvwrapper 是對 virtualenv 的一個封裝,目的是使后者更好用。
關於為什么使用 shell 腳本開發,作者專門 進行了解釋 。
virtualenvwrapper 還有針對 vim 用戶和 emacs 用戶的 擴展 。
virtualenvwrapper 能支持 bash/ksh/zsh ,所以我們可以看出,它不支持 Windows。
virtualenvwrapper-win
由於 virtualenvwrapper 基於 shell 開發,因此不能在 Windows 系統上使用。但我們可以使用針對 Windows batch shell 的 virtualenvwrapper-win。
5. Python版本環境切換工具
上面介紹的工具中,屬於虛擬環境切換工具,下面再介紹幾個 Python版本環境切換工具。將這兩套工具結合使用,可以完美解決 python 多版本環境的問題。
pyenv
我們可以用許多方法讓不同的 Python 版本在系統上共存。
例如在 OS X 上,如果使用官方提供的 DMG 版本安裝,那么自帶的 python2 和新安裝的 python3 是可以共存的。python3 可以使用 python3 來調用,甚至 pip 都可以使用 pip3 來調用。
但如果還有其它小版本需要共存么?我要記憶多少命令呢?
pyenv 用來解決這類問題。
pyenv是第三方的、開源的多版本Python管理工具,用以管理在一台機器上多個Python發行版本的共存問題,比如一台Linux機器上同時安裝Python2.7、Python3.4、Python3.5三個版本的管理。
它可以安裝、卸載、編譯、管理多個 python 版本,並隨時將其中一個設置為工作環境。
pyenv 不支持 Windows 系統。
pywin
Windows 上有一個 pyenv 的替代品,是 pywin 。它用來在多個安裝的 Python 版本之間進行切換,也支持 MSYS/MINGW32 。
Python Launcher for Windows
Python 從3.3版本開始(又是3.3?),在 Windows 系統中自帶了一個 py.exe 啟動工具。如果你是使用 Python.org 官網下載的安裝包安裝的 Python 3.3(或更新版本)環境,那么可以直接在命令提示符中使用這個工具。
py 可以打開默認的 python 提示符; py -2.7 和 py -3 打開對應的 Python 版本。
6. 總結
python虛擬環境的好處是:每個虛擬環境之間,以及虛擬環境和系統環境之間是完全隔離的,不同虛擬環境中,你可以安裝不同版本的模塊,就仿佛你可以同時擁有N多個不同的python開發環境。
唯一麻煩的一點是:每次進入某個虛擬環境之前,都要使用source命令激活。每次使用完,都要使用deactivate命令退出。
參考文獻
https://docs.python.org/3/tutorial/venv.html.
https://docs.python.org/3/library/venv.html#module-venv.
https://virtualenv.pypa.io/en/latest/.
https://www.cnblogs.com/qinhan/p/9293126.html
https://blog.csdn.net/lanonjj/article/details/51050212
https://blog.zengrong.net/post/python_virtual_env/
https://www.jianshu.com/p/2fdb53825d35
zrong’s blog 《Python虛擬環境》 http://zengrong.net/post/2167.htm 強力推薦,講得十分細致全面
關於pyenv 《Linux 下的 Python多版本管理(pyenv)》http://my.oschina.net/lionets/blog/267469
BASIN OF ATTRACTION 在Python3.4環境中使用pyvenv(即venv模塊)替換Flask官方推薦的virtualenv的實踐筆記 http://huangziwei.com/tech/pyvenv/
————————————————
版權聲明:本文為CSDN博主「慕城南風」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lovedingd/article/details/106721585
