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

问题描述 投票:26回答:4

在我的系统上,我有多次安装了几个模块。举个例子,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', 
 ...]

所以,似乎导入订单是

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

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

python module pythonpath versions sys.path
4个回答
8
投票

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

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

$ 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

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


3
投票

我在没有管理员访问权限的Mac上遇到此问题。我的解决方案如下:

  1. 找到要使用的numpy版本的目录。对我来说这是/Library/Python/2.7/site-packages
  2. 创建一个文件~/.startup.py并在.bashrc文件中使用PYTHONSTARTUP=~/.startup.py指向它
  3. .startup.py

import sys

sys.path.insert(0,'/Library/Python/2.7/site-packages/')

import numpy

print("Importing numpy version"+numpy.__version__)

这对我来说似乎很好。我希望它有所帮助。


2
投票

虽然virtualenv似乎是要走的路,但是从Force python to use an older version of module (than what I have installed now)开始,你也可以使用修改版

import pkg_resources
pkg_resources.require("Twisted==8.2.0")
import twisted

1
投票

在使用easy_install安装最新的numpy模块之后,我在Debian Wheezy上遇到了同样的问题。

新的numpy模块安装在/usr/local/lib/python2.7/dist-packages/numpy,而旧的模块在/usr/lib/pymodules/python2.7/numpy。当我尝试导入numpy模块时,导入了旧版本。正如你所说,添加到PYTHONPATH新模块路径没有帮助,因为在旧条目下面的sys.path中添加了。

问题似乎是在easy-install,因为它创建了一个文件easy-install.pth,它在任何本地模块之前导入/usr/lib/pymodules/python2.7。

为了解决这个问题,我刚刚编辑了文件/usr/local/lib/python2.7/dist-packages/easy-install.pth并注释掉了/usr/lib/pymodules/python2.7这一行,所以这一行将放在sys.path下面。

© www.soinside.com 2019 - 2024. All rights reserved.