Python:从多个已安装的模块版本中选择一个

Jen*_*nny 26 python module versions pythonpath sys.path

在我的系统上,我有多次安装了几个模块.举个例子,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', 
 ...]
Run Code Online (Sandbox Code Playgroud)

所以,似乎导入订单是

  1. 当前目录
  2. 鸡蛋来自 PYTHONPATH
  3. 来自本地模块路径的鸡蛋(~/.local/lib/python2.7/site-packages/*.egg)
  4. 系统范围的模块路径(~/usr/lib/python2.7/dist-packages/)
  5. 来自的目录 PYTHONPATH
  6. 中间路径(为简洁起见省略)
  7. userbase目录(~/.local/lib/python2.7/site-packages/)

我的问题是我需要在项目3和项目4之前放置项目5.以使我的代码正常工作.现在,如果我numpy 1.8.0/local/*目录导入一个编译过的模块,并且这个模块导入numpy,它仍然会从/usr/*目录中取出numpy 并失败.

我通过在我的脚本中放置这样的东西来规避这个问题:

import sys
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/')
Run Code Online (Sandbox Code Playgroud)

因此,我可以强制Python使用正确的导入顺序,但当然这不是一个解决方案,因为我必须在每个脚本中执行此操作.

rke*_*rsh 9

除了评论部分已经提出的建议外,您是否考虑过使用virtualenv?这将使您可以对要使用的每个模块进行细粒度控制.如果您不熟悉virtualenv,您将需要阅读文档以了解它的工作原理.

例如,你可以安装和设置它,就像这样(virtualenv-1.11.6 看起来是目前最新的版本):

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz
$ tar xvfz virtualenv-1.11.6.tar.gz
$ cd virtualenv-1.11.6
$ python virtualenv.py ../numpyvenv
$ cd ../numpyvenv
$ source ./bin/activate
(numpyvenv) $ pip install numpy
# downloads, compiles, and installs numpy into the virtual environemnt
(numpyvenv) $ python
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.version.version
'1.9.1'
>>> quit()
(numpyvenv) $ deactivate
$ # the virtual environment has been deactivated
Run Code Online (Sandbox Code Playgroud)

上面,我们创建了一个名为"numpyvenv"的虚拟环境,激活了环境,安装了numpy,打印了numpy版本(显示它的工作原理),退出了python,并停用了环境.下次激活环境时,numpy将与您安装的任何其他模块一起存在.尝试这个时你可能会遇到打嗝,但它应该让你开始.