67

在过去的几年里,我已经安装了许多 Python 库和不同的 Python 版本。为了让它们立即准备好工作,我盲目地安装它们,不受控制。目前,当我尝试安装调用 numpy、scipy 和 matplotlib 的pynest时,它们会导致问题。经过努力,我将清理并重新安装 Python 和库。

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

  • /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现在给出/usr/bin/python指向/System/Library/Frameworks.

现在,我重新安装python是否是一个清晰的环境?如何仔细检查是否存在其他版本?我应该如何重新安装它们以保证它们和它们的库不会无处不在并且不会再有很多副本?

我想将一个干净的 Python 2.7 安装到适当的位置,并让我的系统确切地知道它在哪里,并且永远不要在其他地方安装任何库。请给我一些建议,告诉我如何以专业的方式管理它。

供您参考,这是我当前的$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_finkpip
  • .dmg有时;
  • .pkg有时;
  • 有时编译源代码;

他们在不同的地方制造东西。我想知道这些方式背后的机制是什么?他们如何选择目标位置?如何防止他们把事情搞砸?

4

5 回答 5

37

为什么搞砸了?

正如 OP 的更新所说,有几种不同的方式来安装 Python,它们将文件定位在不同的位置。例如,macports将事物放入/opt/local/,而homebrew将事物放入/usr/local/。此外,Mac OS X 自带了一些 python 版本。因此,如果您通过不同的方式多次安装 python,您将获得许多独立存在于系统上的 python 版本

它会导致什么问题?

我不确切知道。我想问题是如果你有很多版本的python,那么使用哪一个以及在哪里可以找到包将分别由系统中的路径顺序PATH决定PYTHONPATH。因此,您可能无法控制安装 python 模块的位置。考虑一下,如果你运行sudo python setup.py install安装一个模块(它通过 root 找到 python PATH)然后尝试import通过模块python -c "import it"(这次它通过 your 找到 python PATH),可能会出现问题。这是我的猜测,我没有验证它。但就我自己而言,确实出了点问题。

如何避免这种情况?

我认为原则是要意识到不同的方式和工具将东西独立安装到不同的位置,因此请谨慎使用它们

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

那么,我是如何解决我自己的案子的呢?

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

于 2013-01-05T16:51:00.543 回答
15

这是让我感到困惑的事情以及我如何解决它。

$ 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 下的版本是使用系统默认的。您可以根据模块搜索路径来判断:

$ /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。

现在它找到了我所有的 pip 安装模块!问题解决了!


更新:

将 brew 更新到 1.5.4 版后,似乎删除了符号链接。现在您必须将其添加到您的路径中:

export PATH="/usr/local/opt/python/libexec/bin:$PATH"

阅读“brew info python”中的注意事项部分:

==> Caveats
This formula installs a python2 executable to /usr/local/bin.
If you wish to have this formula's python executable in your PATH then add
the following to ~/.bash_profile:
  export PATH="/usr/local/opt/python/libexec/bin:$PATH"

Pip and setuptools have been installed. To update them
  pip2 install --upgrade pip setuptools

You can install Python packages with
  pip2 install <package>

They will install into the site-package directory
  /usr/local/lib/python2.7/site-packages

See: https://docs.brew.sh/Homebrew-and-Python.html
于 2017-06-24T01:31:32.763 回答
8

为了将 python 发行版安装到特定文件夹中,您可以--prefix在 python 安装期间使用该方案。例如,使用前缀方案,您可以将 Python 2.7 安装到文件夹/opt/py27中。现在,为了使用新安装的 Python 发行版,您必须:清理PATHLD_LIBRARY_PATH

  • 删除所有“旧”Python 路径和
  • 配置(根据我的示例)这样的环境变量:
    • 路径:添加 /opt/py27/bin
    • LD_LIBRARY_PATH:添加 /opt/py27/lib

就是这样。

(如果您需要同时安装多个 Python 环境,我建议您查看virtualenv

于 2013-01-02T08:13:51.997 回答
4

这是管理不同 python 版本的另一个很好的解决方案:

https://github.com/pyenv/pyenv

(我已经在这里提供了答案,但决定将此作为附加或替代答案发布)

于 2017-12-08T22:23:56.197 回答
0

tl;博士
brew install python

症状 我有类似的问题,python 程序没有找到依赖项。
我的 python3 版本是一个损坏的符号链接。
我的 pip 指向 python 3.8
而我的 pip3 指向 3.9
python -V 正在输出一些 python 2.7 版本
python3 -V 正在输出一些 python3.8 版本

解决方案
我跑了brew install python,它解决了我所有的问题。

于 2020-12-12T14:43:29.500 回答