PATH问题与在OSX上安装Python 2和Python 3的自制程序有关



我对编程相对陌生,一直搜索到指尖发青,但似乎找不到解决问题的方法。

我在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
>>> 

从终端启动IDLE for Python 2,我还可以导入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
>>> 

然而,如果我为Python3启动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/通过终端启动IDLE for Python 3可以正确导入所有内容,但我不想每次启动Python 3时都这样做。

如果您有任何想法或想法,我们将不胜感激!感谢:)

好的,下面是我想让你做的:

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

$> easy_install pip

接下来,获取虚拟环境。

$> 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的"全局"安装,然后在虚拟环境中使用它。

最新更新