我的系统上有太多不同的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软件包将由系统PATH
和PYTHONPATH
的path顺序分别确定。 所以你可能会失去控制安装python模块的地方。 考虑一下,如果你运行sudo python setup.py install
来安装一个模块(它通过根PATH
findpython),然后尝试通过python -c "import it"
模块python -c "import it"
(这次它通过你的PATH
findpython),也许会出事。 这是我的猜测,我没有validation它。 但在我自己的情况下,有一些事情出错了。
如何避免这一点?
我认为这个原则应该是意识到,不同的方式和工具是独立安装在不同的位置,所以要谨慎使用它们 。
- 除非你打算,不要通过不同的方式两次安装相同的东西。 (如果你打算用python做,你可能想看看
virtualenv
) - 注意
PATH
的path顺序,并考虑是否正确。 - 在安装模块时,要清楚哪些python(或pip)正在运行以及模块的安装位置。
那么,我怎么解决我自己的情况呢?
既然它已经搞乱了,而且似乎很难治愈,所以最后我通过完整的操作系统重新安装来解决这个问题,并开始遵循上面的DOs-and-DONTs 。 为了安装python(numpy / scipy / matplotlib,其中显示问题让我问这个问题)的科学环境,我发现这个教程是非常有帮助的。 那么,问题最终解决了。
为了将python分发安装到特定的文件夹中,可以在python安装过程中使用--prefix
scheme。 使用前缀scheme ,可以将Python 2.7安装到文件夹/opt/py27
。 现在,为了使用新安装的Python发行版,您必须: 清理 PATH和LD_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。
现在它发现所有我的点子安装模块! 问题解决了!