樹莓派上多版本python及pip安裝使用管理指南

python3在科學計算、深度學習等領域已經大行其道,python2也即將在2020年後逐漸退出歷史舞臺。但是,在樹莓派上,很多軟件依然依賴於python2,我們甚至不能將python默認版本設置爲python3版本,否則在實際使用過程中可能面臨諸多不必要的麻煩。在樹莓派環境下,如果需要用到python3,還是建議大家使用python虛擬環境。

一、安裝python

樹莓派上安裝了Python2.7及Python3.5(Raspbian Stretch 9.3),且默認使用Python2(即python是指向python2.7的)。
如果沒有安裝,可以使用以下方法安裝:

1. 安裝Python

# 安裝python(指向python2)
sudo apt-get install python-dev

# 安裝python3
sudo apt-get install python3-dev

2. 調整python命令指向

技術層面上,我們可以在樹莓派上將python命令指向python3:

sudo ln -s /usr/bin/python3.5 /usr/bin/python

但是,實際使用中,目前爲止我還是不推薦這樣的改動。因爲在實踐中我遇到了很多由此引起的不必要的問題。
我的建議是,要使用python3時,使用python3命令,或者使用虛擬環境。

二、安裝pip

1. pip安裝

一般來說Python2和Python3也都是各自安裝有pip模塊的。如果沒有安裝,可以使用以下方法安裝:

首推使用官方pip安裝腳本安裝,可以安裝最新版本的pip,獲得更好的體驗。

# 【薦】使用官方pip安裝腳本安裝(安裝在python2的site-packages下)、安裝pip3(安裝在python3的site-packages下)
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py
sudo python3 get-pip.py

# 使用apt-get安裝pip(安裝在python2的dist-packages下)、安裝pip3(安裝在python3的dist-packages下)
sudo apt-get install python-pip
sudo apt-get install python3-pip

# 使用easy_install模塊安裝pip(安裝在python2的dist-packages下)、安裝pip3(安裝在python3的dist-packages下)
sudo python -m easy_install pip
sudo python3 -m easy_install pip

【注】:apt-get安裝或者easy_install,包括後面用pip安裝模塊都會安裝在python的dist-packages目錄下,只有從源碼安裝纔會安裝在site-packages下。

2. pip升級

可以用以下方法升級pip:

​pip install --upgrade pip
或
​pip install -U pip
或
python -m pip install --upgrade pip
或
python -m pip install -U pip
或
easy_install --upgrade pip

3. 調用pip

pip實際上是依賴於python環境的一個包,因此在使用pip安裝模塊時,究竟由哪個python環境調用就決定了模塊被安裝到了什麼位置。
我們先來查看一下pip命令指向的python解釋器:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import re
import sys

from pip._internal import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

因此可以確定,這種情況下直接調用pip命令的話,會把包安裝到python2的環境下。
再看一下pip3命令:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
import re
import sys

from pip._internal import main

if __name__ == '__main__':
    sys.argv[0] = re.sub(r'(-script\.pyw?|\.exe)?$', '', sys.argv[0])
    sys.exit(main())

與調整python命令指向類似,同樣可以在技術層面上使pip命令默認指向python3環境下的pip模塊,但是我不建議。

sudo nano /usr/local/bin/pip【具體位置可以用which pip查詢,可能與此不同】
將第一句由#!/usr/bin/python2修改爲#!/usr/bin/python3

除了直接使用pip/pip3命令外,直接用python -m/python3 -m命令調用pip/pip3更爲準確,雖然可能麻煩了一些:

python -m pip install xxx
python3 -m pip install xxx

三、pip配置

很多人在用到pip時,都是上來就是一頓pip install操作,對pip沒有一個基本瞭解,以至於出現各種問題,例如安裝慢、沒有權限等。

1. 配置文件

Linux環境下,pip配置文件的位置可能爲:
虛擬環境級別:$VIRTUAL_ENV/pip.conf
用戶級別: ~/.pip/pip.conf 或者 ~/.config/pip/pip.conf(兩者同時存在時,前者優先級最高)。
global級別:/etc/pip.conf
可以用pip config查看當前的配置:

# 列舉當前配置
pip config list
# 列舉虛擬環境級別的配置
pip config --site list
# 列舉用戶級別的配置
pip config --user list
# 列舉系統級別的配置
pip config --global list

2. 配置參數

配置文件中包含多個section,每個section包含用[]框起來[section header],以及具體的配置選項和參數。
section header來自於pip命令行的命令(如install, freeze等),以及一個[global]用於設置全局參數。

而具體的配置選項有兩個來源:(1)來自於各個命令的選項的非縮寫版本,如index-url等;(2)來自於General options,例如timeout,trusted-host等。

【Note1】[global]下設置的參數可以在具體的section header下面再做自定義配置,pip將以具體的section header下的配置爲準,例如:

[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
[install]
index-url=http://mirrors.aliyun.com/pypi/simple/

則index-url=http://mirrors.aliyun.com/pypi/simple/纔是生效的。

【Note2】前述了三個級別的配置文件,當三個級別的配置文件同時存在時,配置都會被加載進來,但是當配置選項存在衝突時,優先級虛擬環境級別(虛擬環境被激活)>用戶級別>系統級別(需要權限)。

3. 示例:鏡像源配置

在國內,pip默認的鏡像源下載是很慢的。可以用以下配置修改國內的鏡像源,清華、阿里、中科大等都有pypi的鏡像源。

[install]
index-url=http://mirrors.aliyun.com/pypi/simple/
# 表示信任mirrors.aliyun.com
trusted-host=mirrors.aliyun.com

囉嗦一句,鏡像源的配置可以放在user級別的配置文件中,避免每個虛擬環境都要配置,但也不必放在系統級別(需要權限)。雖然很多時候,我們可能都掌握着這個權限,但我的建議是,如果你不是個管理員,不懂得如何管理的話,還是把東西都放在user級別就可以了。

四、pip安裝模塊 - 安裝位置選擇與權限問題

pip沒有做好安裝位置選擇時,比較容易出問題,如權限問題、安裝位置混亂等。前面有提及site-packages和dist-packages的區別,但這裏我們配置安裝位置不需要精確到這兩個目錄,只需定位到lib的上一級目錄即可,例如
系統級別:/usr/local/lib/
用戶級別:~/.local/
虛擬環境級別:~/.virtualenvs/venv_name/
在給sudo權限的情況下,默認安裝到系統級別,安裝在系統級別下的包所有用戶都可以訪問;
加上–user參數時,默認安裝至用戶級別目錄;
在虛擬環境下,就會安裝到虛擬環境級別目錄。
安裝位置也可以在配置文件中設置,例如:

[install]
prefix=~/.virtualenvs/venv_name/

若非必要,建議不要自行配置安裝位置,配置不好反而適得其反。啥時候必要呢?有的時候一些包會默認安裝到系統級別,那麼就會出現Permission Denied,可以嘗試自定義prefix來解決這個問題。

【參考文獻】

https://pip.pypa.io/en/stable/reference/pip_config/#options
https://pip.pypa.io/en/stable/user_guide/#configuration

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章