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

时间:2014-05-23 15:08:49

标签: python module pythonpath versions 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', 
 ...]

所以,似乎导入订单是

  1. 当前目录
  2. 来自PYTHONPATH
  3. 的鸡蛋
  4. 来自本地模块路径的鸡蛋(~/.local/lib/python2.7/site-packages/*.egg
  5. 系统范围的模块路径(~/usr/lib/python2.7/dist-packages/
  6. 来自PYTHONPATH
  7. 目录
  8. 中间路径(为简洁起见省略)
  9. 用户库目录(~/.local/lib/python2.7/site-packages/
  10. 我的问题是我需要在第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使用正确的导入顺序,但当然这不是解决方案,因为我必须在每个脚本中执行此操作。

4 个答案:

答案 0 :(得分: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将与您安装的任何其他模块一起存在。尝试这个时你可能会遇到打嗝,但它应该让你开始。

答案 1 :(得分:3)

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

  1. 找到您要使用的numpy版本的目录。对我而言,这是~/.startup.py

  2. 创建文件PYTHONSTARTUP=~/.startup.py并在.bashrc文件中使用.startup.py指向该文件

  3. import sys

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

    import numpy< ---在标准零件

    之前导入此内容

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

    internal var shouldRotate = true func application(application: UIApplication, supportedInterfaceOrientationsForWindow window: UIWindow?) -> UIInterfaceOrientationMask { if shouldRotate { return UIInterfaceOrientationMask.Landscape } else { return UIInterfaceOrientationMask.Portrait } } < ----提醒我们已经更改了numpy版本

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

答案 2 :(得分: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

答案 3 :(得分: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并发表评论就行 {{ 1}} 所以这一行将放在sys.path中。