【发布时间】:2023-03-31 11:55:01
【问题描述】:
在我的系统上,我多次安装了多个模块。举个例子,numpy 1.6.1 安装在标准路径 /usr/lib/python2.7/dist-packages 中,我在 /local/python/lib/python2.7/site-packages/ 安装了 numpy 1.8.0 的更新版本。
我不能简单地删除旧版本的原因是我无权更改工作计算机上的任何内容。但是我需要使用新的 numpy 版本。
我已将/local/python/lib/python2.7/site-packages/ 添加到我的PYTHONPATH。不幸的是,这无济于事,因为/usr/lib/python2.7/dist-packages首先被插入到路径中,因此numpy 1.6.1将被加载。这是一个例子:
>>> import os
>>> print os.environ['PYTHONPATH']
/local/python/lib/python2.7/site-packages
>>> import pprint
>>> import sys
>>> pprint.pprint(sys.path)
['',
'/local/python/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg',
'/local/python/lib/python2.7/site-packages/pyparsing-2.0.1-py2.7.egg',
'~/.local/lib/python2.7/site-packages/setuptools-3.4.4-py2.7.egg',
'~/.local/lib/python2.7/site-packages/mpldatacursor-0.5_dev-py2.7.egg',
'/usr/lib/python2.7/dist-packages',
'/local/python/lib/python2.7/site-packages',
'/usr/lib/python2.7',
...,
'~/.local/lib/python2.7/dist-packages',
...]
所以,看来导入顺序是
- 当前目录
- 来自
PYTHONPATH的鸡蛋 - 来自本地模块路径的鸡蛋 (
~/.local/lib/python2.7/site-packages/*.egg) - 系统范围的模块路径 (
~/usr/lib/python2.7/dist-packages/) - 来自
PYTHONPATH的目录 - 中间路径(为简洁起见,省略)
- 用户基础目录 (
~/.local/lib/python2.7/site-packages/)
我的问题是我需要将第 5 项放在第 3 项和第 4 项之前,我的代码才能正常工作。现在,如果我从/local/* 目录中导入一个针对numpy 1.8.0 编译的模块,并且该模块导入了numpy,它仍然会从/usr/* 目录中获取numpy 并失败。
我通过在我的脚本中放置类似这样的东西来规避这个问题:
import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
因此我可以强制 Python 使用正确的导入顺序,但这当然不是解决方案,因为我必须在每个脚本中都这样做。
【问题讨论】:
-
您的问题的真正解决方案是您的own copy of Python' s modules。
-
我真的不明白这会有什么帮助,因为来自用户群的模块是在 来自全球基地的模块之后导入的。为了清楚起见,我更新了我的问题。
-
我应该说你自己的 Python 副本。
-
我同意 - 但如果我有权在此处安装任何东西,我只需更新模块即可解决问题。关键是,我没有有权限,它是一台工作计算机,我必须规避多个模块版本的问题。
-
您可以在主目录中安装自己的 Python 副本,无需在系统范围内安装。
标签: python module pythonpath versions sys.path