2
我發現我使用的服務器管理員往往會使python模塊非常過時,我沒有時間等待此人更新全局目錄。將Python標準庫中的模塊安裝到本地目錄的標準方式是什麼?
有沒有什麼辦法可以讓我的本地python模塊優先於全局庫而無需手動修改sys.path?
我發現我使用的服務器管理員往往會使python模塊非常過時,我沒有時間等待此人更新全局目錄。將Python標準庫中的模塊安裝到本地目錄的標準方式是什麼?
有沒有什麼辦法可以讓我的本地python模塊優先於全局庫而無需手動修改sys.path?
有多種選擇。如果您使用Python 2.6或更高版本,則可以使用Python的Distutils支持的user installation scheme將Python模塊安裝到您的主目錄中。如鏈接中所述,只需將--user
添加到setup.py install
命令。另一個流行的選擇是使用第三方virtualenv
包創建一個或多個獨立的本地Python環境。
更新:對於user installation scheme
,在Python啓動過程中檢查用戶site-packages目錄。如果該目錄存在,則將其添加到系統站點包目錄之前的sys.path
。例如,使用Debian Linux安裝:
$ python2.7 -c 'import site; print(site.USER_SITE)'
/home/nad/.local/lib/python2.7/site-packages
$ ls -l /home/nad/.local/lib/python2.7/site-packages
ls: cannot access /home/nad/.local/lib/python2.7/site-packages: No such file or directory
$ python2.7 -c 'import sys; print(sys.path)'
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7']
# user site-packages dir doesn't exist so it's not in sys.path
$ mkdir -p ~/.local/lib/python2.7/site-packages
$ python2.7 -c 'import sys; print(sys.path)'
['', '/usr/lib/python2.7', '/usr/lib/python2.7/plat-linux2', '/usr/lib/python2.7/lib-tk', '/usr/lib/python2.7/lib-old', '/usr/lib/python2.7/lib-dynload', '/home/nad/.local/lib/python2.7/site-packages', '/usr/local/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages', '/usr/lib/python2.7/dist-packages/PIL', '/usr/lib/pymodules/python2.7']
# now user site-packages dir exists so it is in sys.path and before /usr/lib ones
但是,如何確保這將覆蓋系統上已存在的相同的較舊的全局程序包? – 2012-03-26 06:13:56
如果您閱讀@Ned給出的鏈接,那麼它將使用'userbase'來安裝該模塊,以便它不會覆蓋系統默認模塊。當你導入任何模塊時,它將檢查'userbase'的lib的'python'目錄,然後它將檢查系統'python'目錄。 – Nilesh 2012-03-26 06:26:50
這兩種方法都使用Python的搜索順序,可以在'sys'模塊中用作'sys.path',以確保首先搜索用戶目錄。 – 2012-03-26 06:29:53