作为前言,我目前正在运行 OSX 10.9.1 和 Python 2.7。
我想使用 easy_install
安装 Python 包(在本例中为 pip
)。首先我尝试:
easy_install pip
然后我收到一条错误消息,指出我没有对 site-packages
目录的写入权限。没问题:
sudo easy_install pip
一切都下载得很好。下面显示了我安装 pip
后的 Bash session :
$ pip
-bash: /usr/local/bin/pip: Permission denied
$ cd /usr/local/bin/pip
$ ls -l
...
-rwx------ 1 root admin 275 Jan 10 11:05 pip
...
$ chmod 754 pip
chmod: Unable to change file mode on pip: Operation not permitted
$ sudo chmod 754 pip
$ pip
Traceback (most recent call last):
File "./pip", line 5, in <module>
from pkg_resources import load_entry_point
File "build/bdist.macosx-10.8-intel/egg/pkg_resources.py", line 3007, in <module>
File "build/bdist.macosx-10.8-intel/egg/pkg_resources.py", line 728, in require
requirements specified when this environment was created, or False
File "build/bdist.macosx-10.8-intel/egg/pkg_resources.py", line 626, in resolve
pkg_resources.DistributionNotFound: pip==1.5
好吧,也许有些权限仍然困惑。以下是当我查看 /Library/Python/2.7/site-packages/
时 Finder 向我显示的内容:
这是查看同一目录时 ls -l
返回的内容:
...
drwx------ 4 root wheel 136 Jan 10 11:24 pip-1.5-py2.7.egg
...
好的,所以我显然仍然没有使用 pip
的权限,因为我没有存档文件的执行权限。怎么样:
$ chmod 754 pip-1.5-py2.7.egg
chmod: Unable to change file mode on pip-1.5-py2.7.egg/: Operation not permitted
$ sudo chmod 754 pip-1.5-py2.7.egg
$ pip
Traceback (most recent call last):
File "/usr/local/bin/pip", line 9, in <module>
load_entry_point('pip==1.5', 'console_scripts', 'pip')()
File "build/bdist.macosx-10.8-intel/egg/pkg_resources.py", line 378, in load_entry_point
def get_resource_stream(manager, resource_name):
File "build/bdist.macosx-10.8-intel/egg/pkg_resources.py", line 2565, in load_entry_point
section = line[1:-1].strip()
ImportError: Entry point ('console_scripts', 'pip') not found
我的假设是,所有权限都搞砸了,因为我使用了 sudo
,现在我只是在追逐权限。但这可能是错误的。我从来不记得在升级到 OSX 10.9 之前遇到过这个问题。
我的问题是:即使我是计算机的管理员,Unix 系统是否总是使用 sudo
执行此操作?有没有办法让我永久纠正这个问题,以便我实际上有权运行已安装的软件包?您认为我的系统上某个地方的设置不正确吗?
最佳答案
您的假设是正确的,所有权限都被搞砸了,因为您使用了 sudo
。首先改掉使用 sudo 来“解决”问题的习惯。您应该像以 root 身份登录一样仔细思考如何使用 sudo 进行操作。如果你的态度是“没问题:sudo ...”,你(最终)就会陷入一个受伤的世界。每次使用 sudo
时,您都会对 OSX 开箱即用的方式进行又一项更改。
接下来,改掉尝试将所有内容放入操作系统版本的 python 中的习惯。我建议首先清除您的/usr/local,尽管这可能会要求很多。
然后brew install python
- 给自己一个 pristine python 。很好 - 您已经做到了。
which pip
- 确保您使用的是刚刚安装在/usr/local 中的 pip brew;如果没有根据需要调整您的 ~/.bashrc
启动文件。
下一步 brew install virtualenv
和 brew install virtualenvwrapper
- 当您 pip install
某些东西来支持仅影响该项目的项目时,请做到这一点一个项目。当您执行此操作时,将 export PIP_REQUIRE_VIRTUALENV=true
添加到 ~/.bashrc
中,这样您就不会忘记并在将来搞砸。
现在了解 virtualenv并开始了解项目的真正依赖关系,并停止对抗因不同项目的需求相互干扰而引起的冲突,以及不加区别地使用 sudo 会导致的一般位腐烂。
关于python - easy_install 和文件权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21050953/