如何告诉Python更喜欢$HOME/lib/Python中的模块而不是/usr/lib/Python



在Python中,我遇到了一个错误,因为它正在从/usr/lib/python2.6/site-packages加载模块,但我希望它使用我在$HOME/python-modules/lib/python2.6/site-packages中的版本,我使用pip-python --install-option="--prefix=$HOME/python-modules --ignore-installed 安装了它

如何告诉Python使用我的库版本?将PYTHONPATH设置为$HOME/python-modules/lib/python2.6/site-packages没有帮助,因为/usr/lib/...显然具有优先级。

查看站点模块,了解自定义环境的方法。

实现这一点的一种方法是将一个文件添加到sys.path上当前名为usercustomize.py的位置,当Python启动时,它将自动导入该文件,您可以使用它来修改sys.path

首先,将$PYTHONPATH设置为$HOME(如果$PYTHONPATH有值,则添加$HOME),然后创建具有以下内容的文件$HOME/usercustomize.py

import sys, os
my_site = os.path.join(os.environ['HOME'],
                       'python-modules/lib/python2.6/site-packages')
sys.path.insert(0, my_site)

现在,当您启动Python时,您应该在sys.path上的系统默认值之前看到您的自定义站点包目录。

较新的Python版本现在内置了搜索opendesktop位置的支持:

$HOME/.local/lib/pythonX.Y/site-packages

如果您将本地模块放在那里,就不必进行任何sys.path操作。

如果安装了多个版本的软件包,例如SciPy:

>>> import scipy; print(scipy.__version__); print(scipy.__file__)
0.17.0
/usr/lib/python3/dist-packages/scipy/__init__.py

如果希望首选用户安装的版本(例如使用pip install --user --upgrade scipy安装),则需要~/.local/lib/python3.5/site-packages/中的usercustomize.py文件,其中包含以下内容:

import sys, os
my_site = os.path.join(
    os.environ['HOME'], '.local/lib/python%d.%d/site-packages' % (
        sys.version_info[0], sys.version_info[1]))
for idx, pth in enumerate(sys.path):
    if pth.startswith('/usr'):
        sys.path.insert(idx, my_site)
        break
else:
    raise ValueError("No path starting with /usr in sys.path")

(for循环选择索引确保以"开发模式"安装的包优先)现在我们得到了SciPy:的用户特定版本

>>> import scipy; print(scipy.__version__); print(scipy.__file__)
0.18.1
/home/user/.local/lib/python3.5/site-packages/scipy/__init__.py

更喜欢安装在用户基础上的软件包(例如pip install --user --upgrade cool_thing

~/.bashrc~/.profile或shell的任何init文件中,添加

export PYTHONUSERBASE="$HOME/python-modules"

$PYTHONUSERBASE/usercustomize.py

#!/usr/bin/env python
import sys, site
sys.path.insert(0, site.getusersitepackages())

最新更新