我的系统上有太多不同的Python版本,导致问题

在过去的几年中,我已经安装了许多Python版本的Python库。 为了让他们立即工作,我盲目地安装了他们,没有控制。 目前,当我尝试安装调用numpy,scipy和matplotlib的pynest时,它们导致问题。 挣扎之后,我将清理并重新安装Python和库。

经过调查,我发现Python 2.5 / 2.6 / 2.7 / 3.2在我的系统上,他们每个都有一些副本或其他东西:(我的操作系统== Mac OS X 10.7.5狮子

  • /Library/Frameworks/
  • /opt/local/Library/Frameworks/
  • /opt/local/bin/
  • /Applications/
  • /usr/local/bin/
  • /usr/bin/
  • /System/Library/Frameworks/

我知道我疯了,有这些。 现在我删除了/System/Libarary/Frameworks (我从来没有从/System/Library/删除任何东西)。 在干净的工作之后, which python现在提供链接到/System/Library/Frameworks /usr/bin/python

现在,我重新安装Python是否是一个清晰的环境? 如何仔细检查,没有其他版本存在? 我应该如何重新安装,以确保他们和他们的图书馆不会到处都有,并且还有很多副本?

我想将一个干净的Python 2.7安装到一个合适的位置,并让我的系统确切地知道它在哪里,而不是在其他地方安装任何库。 请给我一些build议,如何以专业的方式来pipe理它。

为了您的信息,这里是我目前的$PATH ,我认为它应该被修改:

 /opt/local/bin:/opt/local/sbin:/opt/nest/lib/python2.7/site-packages:/usr/local/lib/python2.7/site-packages:/Library/Frameworks/Python.framework/Versions/2.7/bin:/usr/texbin:/Library/Frameworks/Python.framework/Versions/3.2/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/texbin:/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/site-packages/django/bin:/usr/X11/bin:/opt/local/bin:/opt/local/sbin:/usr/local/lib/python2.7/site-packages:/Library/Frameworks/Python.framework/Versions/2.7/bin:/Library/Frameworks/Python.framework/Versions/3.2/bin 

请让我知道如果你需要更多的信息。 谢谢!


更新

为什么我变得这么疯狂呢? 我相信这是因为我通过以下方式安装了东西:

  • easy_install / macports / homebrew / fink / pip有时;
  • .dmg有时;
  • 有时候
  • 有时编译源代码;

他们在不同的地点 我不知道这些方法背后的机制是什么? 他们如何select目标位置? 如何防止他们搞砸了?

为什么会搞砸?

有几种不同的方式来安装Python,就像OP的更新说的,他们在不同的位置find文件。 例如, macports把东西放到/opt/local/ ,而homebrew把东西放到/usr/local/ 。 另外,Mac OS X自带几个python版本。 所以,如果你通过不同的方式多次安装python,你会得到许多独立存在于你的系统上的python版本

这会造成什么问题?

我不完全知道。 我想问题是,如果你有很多版本的python,那么使用哪一个版本以及在哪里可以find软件包将由系统PATHPYTHONPATH的path顺序分别确定。 所以你可能会失去控制安装python模块的地方。 考虑一下,如果你运行sudo python setup.py install来安装一个模块(它通过根PATHfindpython),然后尝试通过python -c "import it"模块python -c "import it" (这次它通过你的PATHfindpython),也许会出事。 这是我的猜测,我没有validation它。 但在我自己的情况下,有一些事情出错了。

如何避免这一点?

我认为这个原则应该是意识到,不同的方式和工具是独立安装在不同的位置,所以要谨慎使用它们

  • 除非你打算,不要通过不同的方式两次安装相同的东西。 (如果你打算用python做,你可能想看看virtualenv
  • 注意PATH的path顺序,并考虑是否正确。
  • 在安装模块时,要清楚哪些python(或pip)正在运行以及模块的安装位置。

那么,我怎么解决我自己的情况呢?

既然它已经搞乱了,而且似乎很难治愈,所以最后我通过完整的操作系统重新安装来解决这个问题,并开始遵循上面的DOs-and-DONTs 。 为了安装python(numpy / scipy / matplotlib,其中显示问题让我问这个问题)的科学环境,我发现这个教程是非常有帮助的。 那么,问题最终解决了。

为了将python分发安装到特定的文件夹中,可以在python安装过程中使用--prefixscheme。 使用前缀scheme ,可以将Python 2.7安装到文件夹/opt/py27 。 现在,为了使用新安装的Python发行版,您必须: 清理 PATHLD_LIBRARY_PATH

  • 删除所有“旧”的Pythonpath和
  • configuration(根据我的例子)像这样的环境variables:
    • path:添加/ opt / py27 / bin
    • LD_LIBRARY_PATH:添加/ opt / py27 / lib

而已。

(如果你需要同时安装多个Python环境,我build议看看virtualenv )

这是什么让我困惑,我怎么解决它。

 $ which python /usr/bin/python $ which python3 /usr/local/bin/python3 $ ls /usr/local/bin/python ls: /usr/local/bin/python: No such file or directory 

所以注意我没有安装python2.7的HomeBrew,但是安装了python3。 / usr / bin / python下的版本使用系统默认值。 你可以根据模块searchpath来判断:

 $ /usr/bin/python Python 2.7.10 (default, Feb 7 2017, 00:08:15) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin `enter code here`Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/Library/Python/2.7/... 

注意'/ Library / Python'…这是Mac OS的python版本。 但我想严格保持用户安装的版本(即HomeBrew)。

所以这是我做了什么来解决这个问题:

 $ brew install python ... Warning: python 2.7.13 is already installed, it's just not linked. You can use `brew link python` to link this version. $ brew link --overwrite python $ which python /usr/local/bin/python $ python Python 2.7.10 (default, Feb 7 2017, 00:08:15) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys.path ['', '/usr/local/Cellar/python/2.7.13... 

它不再是/ Library / ..而是/ usr / local。

现在它发现所有我的点子安装模块! 问题解决了!