PATH在OSX上与自制软件安装的Python 2和Python 3有关

时间:2013-07-03 17:10:20

标签: python path homebrew python-idle pythonpath

我对编程比较陌生并且已经搜索过了,直到我的指尖都是蓝色的,但似乎无法找到解决我遇到的问题的方法。

我在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时都这样做。

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

1 个答案:

答案 0 :(得分:0)

好的,这就是我希望你做的事情:

如果您仍在使用它进行包管理,请停止使用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环境从全局“main”python切换到这个受保护的副本。然后你可以运行:

$> pip install numpy

它只会为python的副本安装它。

一定要运行

$> pip freeze > requirements.txt

在项目的根目录中,您的README.md和其他内容会在哪里,以便其他人可以直接运行:

$> pip install -r PROJECT_ROOT/requirements.txt

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

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

如果这样做,只需卸载numpy的“全局”安装,并在虚拟环境中使用它。