配置Python以使用其他位置的site-packages

47
有没有办法在不修改现有脚本的情况下,告诉Python有关附加site-packages位置的信息?
在我的CentOS 5.5服务器上,我安装了Python 2.7,安装在/opt/python2.7.2中,并且在/opt/python2.7.2/lib/python2.7/site-packages处有一个site-packages文件夹。
这样做的原因是我不想干扰与5.5发行版一起提供的现有Python 2.4安装。
但是,第三方Python应用程序还在/usr/local/lib/python2.7/site-packages处添加了一个site-packages文件夹,并在该位置安装了自己。
这部分是我的责任,因为我在安装之前没有调整应用程序Makefile中的PREFIX,但是现在我无能为力。
我知道可以执行以下操作:
import sys; sys.path.insert(0, "/usr/local/lib/python2.7/site-packages")

然而,这需要我追踪每个脚本并添加上述内容,如果将来有更新的话,这种方法并不理想。

为了解决这个问题,我在/opt/python2.7.2/lib/python2.7/site-packages中创建了一个符号链接,指向第三方应用程序的位置:

ln -sf /usr/local/lib/python2.7/site-packages/theapp /opt/python2.7.2/lib/python2.7/site-packages/theapp

这似乎很好地解决了问题,但我想知道是否有更好的方法?


只是好奇,你的符号链接方法如何处理被链接的目标源发生更改的情况?它能够成功地捕捉到更改吗? - jxramos
1
@jxramos - 这件事情发生的时间太久远了,我实在记不清楚了。当时是为了一个内部服务器运行RhodeCode(Mercurial和Mercurial服务器的Web前端)而进行的一次性操作,看起来一切都很正常。最终我修复了我的错误(至少根据我在Shawn已接受答案下的评论所述 :))。 - Kev
3个回答

53

您可以使用特定站点配置钩子

"路径配置文件是具有形式为name.pth的文件,存在于上述四个目录之一中;其内容是要添加到sys.path中的附加项(每行一个)。"

在您的情况下,您只需放置一个包含要包含的目录路径的.pth文件即可实现所需功能:

[root@home]$ echo "/usr/local/lib/python2.7/site-packages/" > /opt/python2.7.2/lib/python2.7/site-packages/usrlocal.pth

这个很好用,但是我决定下定决心修复部署。不过还是谢谢你,对于未来很有用。 - Kev
4
这将把路径添加到Python路径的末尾。但如果您想让自定义site-packages排在前面呢?我一直在尝试使用sitecustomize.py文件并取得了一些成功,但似乎存在一些边缘情况,仅仅操作Python路径是不够的。 - wryfi

8
你可以用一个包装脚本替换Python可执行文件,该脚本将您添加的安装路径附加到PYTHONPATH中。但这是一种不太优雅的解决方法。
我建议尝试修复插件的安装,使其正确地安装到site-packages目录中。

Shawn的回答解决了问题,但你也是对的,长期来看修复安装实际上更好。 - Kev

0
要更改Python的site-packages路径: 步骤1:通过PYTHONUSERBASE环境变量 a. 对于Windows
SET PYTHONUSERBASE=<custom-path>

For Example:
SET PYTHONUSERBASE=C:\\DEV\python_repo

第二步:通过--user进行操作。
在使用pip安装模块或包时,请按照下面的示例使用--user
python -m pip install --upgrade pip --user

注意:
1. 按照上述步骤将site-packages文件夹复制到自定义位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接