29

在我的系统上,我多次安装了多个模块。举个例子,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/)

我的问题是我需要将第 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 使用正确的导入顺序,但这当然不是一个解决方案,因为我必须在每个脚本中都这样做。

4

4 回答 4

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

上面,我们创建了一个名为“numpyvenv”的虚拟环境,激活环境,安装 numpy,打印 numpy 版本(以显示它有效),退出 python,并停用环境。下次您激活环境时,numpy 将与您安装的任何其他模块一起出现。尝试此操作时您可能会遇到麻烦,但它应该可以帮助您入门。

于 2014-11-24T18:09:01.550 回答
3

我在没有管理员访问权限的情况下使用的 Mac 上遇到了这个问题。我的解决方案如下:

  1. 找到您要使用的 numpy 版本的目录。对我来说这是/Library/Python/2.7/site-packages

  2. 创建一个文件并在 .bashrc 文件中~/.startup.py指向它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__)<---- 提醒我们已经更改了numpy版本

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

于 2016-08-02T09:33:38.680 回答
2

虽然 virtualenv 似乎是要走的路,但从强制 python 使用旧版本的模块(比我现在安装的模块)你也可以使用修改

import pkg_resources
pkg_resources.require("Twisted==8.2.0")
import twisted
于 2019-03-23T12:50:34.453 回答
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 的下方。

于 2016-01-20T14:48:03.003 回答