在我的系统上,我多次安装了多个模块。举个例子,numpy 1.6.1
安装在标准路径中/usr/lib/python2.7/dist-packages
,我有一个numpy 1.8.0
安装在的更新版本/local/python/lib/python2.7/site-packages/
。
我不能简单地删除旧版本的原因是我无权更改工作计算机上的任何内容。但是,我需要使用新的 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 项之前,我的代码才能正常工作。现在,如果我导入一个numpy 1.8.0
从/local/*
目录编译的模块,并且这个模块导入 numpy,它仍然会从/usr/*
目录中获取 numpy 并失败。
我通过在我的脚本中放置这样的东西来规避这个问题:
import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
因此我可以强制 Python 使用正确的导入顺序,但这当然不是一个解决方案,因为我必须在每个脚本中都这样做。