首發于個人公眾號:《Python編程時光》
我的博客原文:http://python.iswbm.com/en/latest/c04/c04_24.html
我的 Github:https://github.com/iswbm/PythonCodingTime
在之前寫過一篇關于虛擬環境使用的文章 :Python 虛擬環境使用指南.
但是還沒有好好的介紹一下 Python 的用戶環境,原因是自己一直沒遇到要使用 用戶環境 的使用場景,所以就一直懶得寫,
恰巧這兩天,自己遇到了一個使用用戶環境的體驗可以完爆虛擬環境的案例,就拿出來分享一下,
1. 我的使用背景
公司有數以萬計的服務器,為了對實作對訪問記錄進行集中管理以及出于安全考慮,每臺服務器都有訪問限制,必須使用公司的跳板機才能登陸,
每個公司的員工在跳板機上都有自己的用戶、 家目錄,對于很多需要 root 權限的操作,是高度受限制的,
比如我現在我要在跳板機上實作遠程登陸大批量的機器進行一些維護作業,當然我這里使用的還是 Python 來實作,這個 Python 腳本里有一些依賴庫(比如 之前介紹過的 paramiko 這個神器),在跳板機上中并沒有安裝,

做為普通用戶的你,是沒有權限安裝第三方包的,

問題就來了,我如何才能在跳板機中使用 paramiko 這個包呢?
2. 為何不使用虛擬環境?
既然不能對全域的 Python 環境進行更改,那我完全可以自己再創建一個環境,只要這個環境里事先裝好 paramiko 這個包不就好了,
因此,使用虛擬環境是一種解決方案,但它并不是一個完美的解決方案,
原因有以下幾點:
1、 創建虛擬環境的程序,步驟較多,比較復雜,這里的復雜是相對于我后面要使用的用戶環境而言,
2、 虛擬環境是包含一整個 Python 解釋器,存在大量與系統重復的包,size比較大,并不輕便,
3、 使用 console 模式除錯的話,進入很不方便

就算你不使用 console 模式,你呼叫腳本的方式,也會很奇怪,你得這樣
$ zabbix_env/bin/python demo.py
如果你不想使用這樣,可以給這個腳本加個可執行權限,并在腳本的第一行指定你的解釋器,省去了一點點麻煩,可即便如此,我仍然感覺很別扭,
[wangbm@35ha02 ~]$ cat demo.py
#!/home/wangbm/zabbix_env/bin/python
import zabbix_api
[wangbm@35ha02 ~]$
[wangbm@35ha02 ~]$
[wangbm@35ha02 ~]$ chmod +x demo.py
[wangbm@35ha02 ~]$
[wangbm@35ha02 ~]$ ./demo.py # 可以執行,沒有報錯
[wangbm@35ha02 ~]$
你可能會問我:為什么不使用 virtualenv + virtualenvwrapper ,這樣可以使用 workon 進入虛擬環境,
原因是跳板機里的都是很古老的包,你看上面的 Python 還是 2.7.5 呢,所以你所說的那些工具通通沒有,
3. 用戶環境原理
這里要介紹的這種方案(用戶環境),可能很多人都沒有使用過,甚至沒有聽過,它算是一個冷門但是非常好用的功能,
操作之前 ,先簡單介紹一下它,
先提一個問題,Python 在查找匯入包時,如果我們多個路徑都有這個包,那 Python 如何確定應該從哪個路徑進行匯入呢?
答案是, 搜索匯入路徑是有優先級的,你可以通過 sys.path 進行查看,
>>> import sys
>>> from pprint import pprint
>>> pprint(sys.path)
['',
'/usr/lib64/python27.zip',
'/usr/lib64/python2.7',
'/usr/lib64/python2.7/plat-linux2',
'/usr/lib64/python2.7/lib-tk',
'/usr/lib64/python2.7/lib-old',
'/usr/lib64/python2.7/lib-dynload',
'/home/wangbm/.local/lib/python2.7/site-packages',
'/usr/lib64/python2.7/site-packages',
'/usr/lib64/python2.7/site-packages/gtk-2.0',
'/usr/lib/python2.7/site-packages',
'/usr/lib/python2.7/site-packages/pip-18.1-py2.7.egg',
'/usr/lib/python2.7/site-packages/lockfile-0.12.2-py2.7.egg']
>>>
可以看到路徑 /home/wangbm/.local/lib/python2.7/site-packages 是優先于 /usr/lib64/python2.7/site-packages 路徑的,
這就是 用戶環境 的原理,只要我們將包裝在自己家目錄下,就可以優先于全域環境中進行查找,
使用起來,可以做到用戶無感知,跟使用原生的全域環境并沒有區別,
4. 具體操作方法
創建一個用戶環境,并安裝上你所需要的包,一條命令就能搞定,這可比虛擬環境簡單方便多了,
那么怎么操作呢?
只要你在使用 pip 安裝包時,加上 --user 引數,pip 就會將其安裝在當前用戶的 ~/.local/lib/python2.x/site-packages 下,而其他用戶的 python 則不會受影響,
$ pip install --user pkg
這里要注意的是,不能使用這種方式,親測它會將包裝到全域環境下,具體原因我還沒有深究,
$ python -m pip install --user pkg
為了讓你理解這個程序,我這里來舉個例子,并且驗證其是否可以做到用戶隔離,
# 在全域環境中未安裝 requests
[root@localhost ~]$ pip list | grep requests
[root@localhost ~]$ su - wangbm
# 由于用戶環境繼承自全域環境,這里也未安裝
[wangbm@localhost ~]$ pip list | grep requests
[wangbm@localhost ~]$ pip install --user requests
[wangbm@localhost ~]$ pip list | grep requests
requests (2.22.0)
[wangbm@localhost ~]$
# 從 Location 屬性可發現 requests 只安裝在當前用戶環境中
[wangbm@localhost ~]$ pip show requests
---
Metadata-Version: 2.1
Name: requests
Version: 2.22.0
Summary: Python HTTP for Humans.
Home-page: http://python-requests.org
Author: Kenneth Reitz
Author-email: [email protected]
Installer: pip
License: Apache 2.0
Location: /home/wangbm/.local/lib/python2.7/site-packages
[wangbm@localhost ~]$ exit
logout
# 退出 wangbm 用戶,在 root 用戶環境中發現 requests 未安裝
[root@localhost ~]$ pip list | grep requests
[root@localhost ~]$
有了這個思路,我就可以先在其他機器(前提自己必須擁有管理員權限 )上,創建一個用戶環境,并且安裝上 paramiko 這個包,
然后將這個用戶環境,壓縮拷貝至跳板機自己的家目錄下的 .local/lib 目錄下并解壓,
然后直接使用 python 進入 console 模式,現在已經可以直接使用 paramiko 這個包了,


轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/17391.html
標籤:Go
上一篇:[go]包和工程管理
