【问题标题】:PATH issues with homebrew-installed Python 2 and Python 3 on OSXOSX 上自制安装的 Python 2 和 Python 3 的 PATH 问题
【发布时间】:2013-07-03 17:10:19
【问题描述】:

我对编程比较陌生,我一直在搜索,直到我的指尖都是蓝色的,但似乎找不到解决我遇到的问题的方法。

我在 OSX 上安装了 Python 2 和 Python 3 的自制版本,我似乎无法在我的 .bash_profile 中获得正确的 PATH/PYTHONPATH 以便能够在 IDLE 的两个版本中正确导入模块。但是,当直接在 shell 窗口中运行 Python 2 或 Python 3 时,我可以导入模块。我正在通过终端启动 IDLE,因此它应该正确初始化路径。

这是我的.bash_profile

export PATH=/bin:/usr/local/bin:$PATH
export PYTHONPATH=/Users/maverett/Documents/PyModules:/Users/maverett/Dropbox/matrix/:$PYTHONPATH

以下是所有四种情况下发生的情况,使用 numpy 作为示例模块。

在终端运行python2时导入:

$ python2
Python 2.7.5 (default, Jun 28 2013, 19:06:25) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> 

从终端启动 Python 2 的 IDLE,我也可以导入 numpy.但是,当我比较 IDLE 中的 sys.path 和终端中的 sys.path 时,它们是不同的。我比较了列表以产生差异并发现:

>>> InIdleNotInTerm 
['/usr/local/Cellar/python/2.7.5/Frameworks/Python.framework/Versions/2.7/bin']
>>> InTermNotInIdle
[]

所以在运行 Python 2 时,IDLE 路径中多了一个目录。

Python 3 的情况完全不同。

$ python3
Python 3.3.2 (default, Jul  1 2013, 10:53:26) 
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>> 

但是,如果我为 Python 3 启动 IDLE(通过在终端中输入 idle3)然后尝试导入 numpy,我会得到

>>> import numpy as np
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    import numpy as np
ImportError: No module named 'numpy'
>>> 

我再次比较了终端和 IDLE 中的sys.path,这次有很大的不同:

>>> pp(InIdleNotInTerm)
['/Library/Frameworks/Python.framework/Versions/3.3/bin',
 '/Library/Frameworks/Python.framework/Versions/3.3/lib/python33.zip',
 '/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3',
 '/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/plat-darwin',
 '/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/lib-dynload',
 '/Library/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages']
>>> pp(InTermNotInIdle)
['/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/distribute-0.6.45-py3.3.egg',
 '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/pip-1.3.1-py3.3.egg',
 '/usr/local/lib/python3.3/site-packages/distribute-0.6.45-py3.3.egg',
 '/usr/local/lib/python3.3/site-packages/pip-1.3.1-py3.3.egg',
 '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python33.zip',
 '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3',
 '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/plat-darwin',
 '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/lib-dynload',
 '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages',
 '/usr/local/Cellar/python3/3.3.2/Frameworks/Python.framework/Versions/3.3/lib/python3.3/site-packages/setuptools-0.6c11-py3.3.egg-info',
 '/usr/local/lib/python3.3/site-packages',
 '/usr/local/lib/python3.3/site-packages/setuptools-0.6c11-py3.3.egg-info']

知道发生了什么吗?我尝试过的其他一些事情:

将 .bash_profile 更改为

export PATH=/bin:/usr/local/bin:$PATH
export PYTHONPATH=/Users/maverett/Documents/PyModules:/Users/maverett/Dropbox/matrix/:/usr/local/lib/python3.3/site-packages/:$PYTHONPATH

导致能够在终端和 IDLE 中导入 Python 3 中的模块,但会中断 Python 2 的导入(因为它会尝试导入 Python 3 版本!)

通过终端从python3.3/site-packages/ 为 Python 3 启动 IDLE 可以正确导入所有内容,但我不想每次启动 Python 3 时都这样做。

您的任何想法或想法将不胜感激!谢谢:)

【问题讨论】:

  • 您是否使用pip 安装了您的模块? easy_install?只是好奇。
  • 根据 Python 2 或 3 使用 pip 或 pip3 安装。

标签: python path homebrew python-idle pythonpath


【解决方案1】:

好的,我希望你这样做:

停止使用easy_install,如果您仍在使用它进行包管理。请改用pip

$> easy_install pip

接下来,获取virtual environments

$> pip install virtualenv
$> mkdir ~/venvs
$> virtualenv ~/venvs/numpy_project --python=python2.7 --no-site-packages

确保将命名良好的目录传递给virtualenv。标准用法是按项目组织您的虚拟环境,因此我将这个虚拟环境命名为“numpy_project”。你可能应该想出一个更好的名字。我也告诉它使用python 2.7,但如果你愿意,你可以选择使用3.3。

基本上,这将为 python 的专用副本创建一个绝缘良好的气泡,以便为特定目的而存在。我还告诉它使用no-site-packages,以确保一张白纸。它使设置该项目的工作变得更加容易,这可以通过运行来完成:

$> source ~/venvs/numpy_project/bin/activate

这会将你的 python 环境从全局“主”python 切换到这个受保护的副本。然后你可以运行:

$> pip install numpy

它只会为那个 python 副本安装它。

一定要跑

$> pip freeze > requirements.txt

在您的项目的根目录中,您的README.md 和其他东西会放在哪里,以便其他人可以简单地运行:

$> pip install -r PROJECT_ROOT/requirements.txt

它会抓取您放入虚拟环境中的所有内容(即numpy)。如果他们也使用虚拟环境,您可以确定他们与您的工作环境完全匹配。不应与其他包和 python 版本重叠或混淆。

试试这个,看看你是否能得到更好的结果。请记住永远不要使用 sudo 运行 pip

如果可行,只需卸载“全局”安装的 numpy,然后在虚拟环境中使用它即可。

【讨论】:

  • 感谢您的帮助!我决定从头开始,让我的 IT 部门为我擦除和重新映像 OS X。我现在正在运行 10.8.4。我喜欢 virtualenv 的想法,但我仍然遇到一些问题。我安装了自制软件并使用它通过brew install pythonbrew install python3 安装 python 2 和 3。然后我用pip安装virtualenvvirtualenvwrapper。我为 Python 2.7 创建了一个环境,并正确设置了我需要的一切。
  • 然后我尝试通过创建(我认为是)一个 Python 3 环境来为 Python 3.3 安装东西,但是在那个环境中工作时,在使用 pip3 安装了一些包之后,我注意到它们是安装在我的全球站点包中。我 pip3 卸载了所有这些并删除了 python 3 virtualenv。我使用 -p 重新创建了一个来指定 python 的版本,但现在我无法让 pip3 在该 virtualenv 中安装任何东西。有什么想法吗?
  • 啊哈!我检查了pippip3 在我的py3 虚拟环境中使用的哪个pip3 是全局的。我用谷歌搜索了一下,发现我需要使用pip-3.3 进行安装,它似乎确实存在于虚拟环境中。会试试这个看看。手指交叉!
猜你喜欢
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多