1

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

我在 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. 但是,当我sys.path在 IDLE 和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'
>>> 

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

>>> 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 版本!)

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

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

4

1 回答 1

0

好的,这就是我希望您执行的操作:

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 版本不应该有重叠或混淆。

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

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

于 2013-07-03T21:14:17.960 回答