配置 Python 以在查找包時包含另一個目錄
我在預設 Python 站點包位置為
/usr/lib64/python2.6/site-packages
. 一些軟體包會自動安裝自己/usr/lib/python2.6/site-packages
。如何配置 Python 以便它也可以查看/usr/lib64/python2.6/site-packages
?
(請根據需要更正錯誤和遺漏。謝謝。)
首先,一個問題和一個評論。我不使用 SUSE,因此請加少許鹽。/usr/lib/python2.6/site-packages 中安裝的軟體包是官方軟體包嗎?如果是這樣,則 SUSE 已損壞,因此不太可能。如果它們不是官方包,您可以要求打包者使用標準路徑,或者,您可以向 SUSE 送出願望清單錯誤,要求他們支持此附加路徑。這將為您和其他人節省額外的麻煩。
目前,您有以下可能性,按範圍遞減順序排列:
- 更改所有使用者的模組搜尋路徑(方法一)
更改 Python 安裝中的模組搜尋路徑。
預設模組搜尋路徑硬連線到二進製文件中。附加路徑可以在執行時配置,例如在 site.py 文件中。例如,Debian 使用 /usr/lib/python2.6/site.py(用於預設的 python 2.6 安裝)來進行特定於站點的配置。在文件的頂部寫著
Append module search paths for third-party packages to `sys.path`. **************************************************************** * This module is automatically imported during initialization. * **************************************************************** [...] This will append site-specific paths to the module search path.
Debian更新檔
debian/patches/site-locations.diff
說對於 Debian 及其衍生版本,此 sys.path 增加了分發包中分發的目錄。本地外掛進入 /usr/local/lib/python/dist-packages,Debian 外掛安裝在 /usr/{lib,share}/python/dist-packages。不使用 /usr/lib/python/site-packages。
有問題的更新檔是
sitedirs.append(os.path.join(prefix, "Lib", "site-packages")) elif os.sep == '/': + sitedirs.append(os.path.join(prefix, "local/lib", + "python" + sys.version[:3], + "dist-packages")) sitedirs.append(os.path.join(prefix, "lib", "python" + sys.version[:3], - "site-packages")) - sitedirs.append(os.path.join(prefix, "lib", "site-python")) + "dist-packages")) + sitedirs.append(os.path.join(prefix, "lib", "dist-python")) else: sitedirs.append(prefix) sitedirs.append(os.path.join(prefix, "lib", "site-packages"))
因此,您可以修改系統包中的 site.path 以生成修改後的模組搜尋路徑。不過,您可能不想這樣做。一方面,您必須在每次更新您的發行版的 python 包時將其合併。 2. 更改所有使用者的模組搜尋路徑(方法2)
將 something.pth 形式的文件添加到已經在搜尋路徑中的目錄中,該目錄包含相對或絕對路徑。例如。
/usr/local/lib/python2.6/dist-packages$ cat foo.pth /home/faheem/dummypythonpath
在另一個終端做
>>> import sys >>> sys.path [...,'/home/faheem/dummypythonpath',...,]
- 更改所有使用者的模組搜尋路徑(方法3)
環境變數 PYTHONPATH 通常用於在使用者級別附加到系統路徑。您可以將其放在一個文件中,該文件將由所有使用者獲取。例如。在 Debian 中,我們有 /etc/bash.bashrc,它在頂部說
# System-wide .bashrc file for interactive bash(1) shells. # To enable the settings / commands in this file for login shells as well, # this file has to be sourced in /etc/profile.
所以你可以在那裡添加或 PYTHONPATH 。您可能希望它同時用於登錄和互動式 shell,因此您需要檢查一下。不幸的是,發行版通常在啟用此功能方面很不穩定。
PYTHONPATH 中的路徑被添加到系統中的預設搜尋路徑列表中(例如可以通過 sys.path 獲得 - 見下文)。考慮到已經設置了 PYTHONPATH 的可能性,只需向其中添加所需的附加目錄,例如。
export PYTHONPATH=$PYTHONPATH:"/home/username/lib/python2.6/dist-packages"
如果您獲取 PYTHONPATH 變數,然後再次檢查 sys.path,您將
看到已添加路徑。請注意,將
PYTHONPATH 中的路徑添加到預先存在的路徑的位置似乎並未由
實現規定。 4. 更改每個使用者的模組搜尋路徑。
通常的方法是在使用者的 bashrc 中更改 PYTHONPATH,即
~/.bashrc
. 再次檢查它是否來自登錄和互動式 shell。 5. 根據每個腳本更改模組搜尋路徑。這是通過附加到 sys.path 來完成的,即import sys sys.path.append(some_additional_path)
這僅適用於正在導入它的腳本。據我所知,這通常用於臨時使用,在非標準位置導入模組時,比如從主目錄中的某個位置。
另請參閱 Greg Ward 關於修改 Python 的搜尋路徑。這對可用的替代方案進行了很好的討論。