Python

配置 Python 以在查找包時包含另一個目錄

  • July 16, 2011

我在預設 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 送出願望清單錯誤,要求他們支持此附加路徑。這將為您和其他人節省額外的麻煩。

目前,您有以下可能性,按範圍遞減順序排列:

  1. 更改所有使用者的模組搜尋路徑(方法一)

更改 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',...,]
  1. 更改所有使用者的模組搜尋路徑(方法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 的搜尋路徑。這對可用的替代方案進行了很好的討論。

引用自:https://unix.stackexchange.com/questions/10113