【问题标题】:Python: select one of multiple installed module versionsPython:选择多个已安装模块版本之一
【发布时间】: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', 
 ...]

所以,看来导入顺序是

  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/)

我的问题是我需要将第 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


【解决方案1】:

除了评论区已经给出的建议,你有没有想过使用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 将与您安装的任何其他模块一起出现。您在尝试此操作时可能会遇到问题,但它应该可以帮助您入门。

【讨论】:

    【解决方案2】:

    我在没有管理员权限的情况下使用的 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__)

    这对我来说似乎很好用。希望对你有帮助。

    【讨论】:

    • 没有正确阅读原始问题,因此意识到我的部分解决方案已经在原始问题中提出,对此表示歉意
    【解决方案3】:

    虽然 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
    

    【讨论】:

      【解决方案4】:

      在使用 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 的下方。

      【讨论】:

        猜你喜欢
        • 2011-08-24
        • 2016-05-19
        • 2016-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-08
        • 2011-12-23
        • 1970-01-01
        相关资源
        最近更新 更多