【发布时间】:2012-09-07 15:43:22
【问题描述】:
我一直在使用 OS X Lion (2.7.2) 附带的标准 python,但我想构建一个 UCS-4 版本来更好地处理 4 字节 unicode 字符。
我已经安装了pip和pytz、virtualenv和virtualenvwrapper等包,这些都安装在/Library/Python/2.7/site-packages。我的$PATH 是/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin。
为了在机器上构建一个新版本的python(在任何项目特定的虚拟环境之外,稍后会出现),我按照this article 上的说明并设法在/usr/local/bin 中构建它。问题是当我启动一个新的 bash 窗口时,我得到了以下 virtualenvwrapper 错误:
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named virtualenvwrapper.hook_loader virtualenvwrapper.sh: There was a problem running the initialization hooks.
If Python could not import the module virtualenvwrapper.hook_loader, check that virtualenv has been installed for VIRTUALENVWRAPPER_PYTHON=/usr/local/bin/python and that PATH is set properly.
说明将/usr/local/bin 移动到/etc/paths 文件的顶部,从那时起我注意到了一些奇怪的问题。我将pip安装到/usr/local/bin,现在我假设由于我在/usr/local/bin工作,并且新安装的python的站点包现在位于/usr/local/lib/python2.7/site-packages,当我做pip freeze时,它应该是空的那里还没有安装任何东西。但是,pip freeze 仍然报告安装在旧 (OS X) 站点包文件夹中的内容。以下是构建后的一些信息:
$ which python
/usr/local/bin/python
$ which pip
/usr/local/bin/pip
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
当我使用 pip 卸载 python 包时,它会按预期将其从旧的 site-packages 文件夹中删除。当我再次安装它时,它不是安装在/usr/local/lib/python2.7/site-packages 中,而是安装在/Library/Python/2.7/site-packages 中(通过尝试再次安装并接收Requirement already satisfied (use --upgrade to upgrade): pytz in /Library/Python/2.7/site-packages
来验证)。如何获取旧站点包文件夹的路径?为什么它不会将它安装在它正在使用的 python 安装的正确位置?
自从推广/usr/local/bin 后,我遇到了其他几个问题,但我想如果我理解了这一点,我就能解决问题。
谁能看到发生了什么?如果您需要更多信息,我很乐意提供。
【问题讨论】:
-
/usr/local/bin/pip 的第一行指向什么,你的自定义 python 安装还是系统安装?
-
啊……shebang 是
#!/usr/bin/python。这解释了很多!这怎么会进入/usr/local/bin的pip版本?? -
@kristaps:我注意到
/usr/local/bin中的很多东西(例如 pip、easy_install、django-admin.py)都有#!/usr/bin/python作为 shebang。你知道为什么会这样吗? -
/usr/local/bin 是传统的放置 OS 不自带的二进制文件的地方,所以 easy_install/pip 把打包好的二进制文件放在那里是很合理的。