在Mac上以root身份运行pip时出现“权限被拒绝”
我开始在我的Mac上安装Python包,和在工作时用Windows电脑的方式一样;不过在Mac上,我经常遇到权限被拒绝的错误,特别是在写日志文件或安装包的时候。
所以我想到了用sudo pip install <package>
来安装,但这样做安全么?因为我只是想在我当前的用户账户下安装这些包。
下面是一个日志文件输入输出错误的示例:
Command /usr/bin/python -c "import setuptools;__file__='/Users/markwalker/build/pycrypto/setup.py';exec(compile(open(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --single-version-externally-managed --record /var/folders/tq/hy1fz_4j27v6rstzzw4vymnr0000gp/T/pip-k6f2FU-record/install-record.txt failed with error code 1 in /Users/markwalker/build/pycrypto
Storing complete log in /Users/markwalker/Library/Logs/pip.log
Traceback (most recent call last):
File "/usr/local/bin/pip", line 8, in <module>
load_entry_point('pip==1.1', 'console_scripts', 'pip')()
File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/__init__.py", line 116, in main
return command.main(args[1:], options)
File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 141, in main
log_fp = open_logfile(log_fn, 'w')
File "/Library/Python/2.7/site-packages/pip-1.1-py2.7.egg/pip/basecommand.py", line 168, in open_logfile
log_fp = open(filename, mode)
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'
更新
这可能是因为权限问题,不过最好的做法是为你的Python项目使用虚拟环境。除非绝对必要,否则应该避免使用sudo pip
。
6 个回答
你最开始的问题是 pip 无法把日志写入文件夹。
IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'
你需要进入一个可以写入的文件夹,比如 /tmp
,所以你可以先输入 cd /tmp
,然后再执行命令,这样可能会成功,但这并不是你想要的。
但是实际上,对于这种情况(你不想用 sudo
来安装 Python 包),而且不需要全局安装包,你可以使用 --user
这个选项,像这样:
pip install --user <packagename>
这样就可以正常工作了。
我假设你是一个用户的 Python 安装,不想去研究 virtualenv(这个不太友好)或者 pipenv。
正如评论区里有些人提到的,接下来的方法并不是一个好主意,除非你不知道该怎么做,卡住了:
另一种方法是 全局包,就像你想做的那样:
chown -R $USER /Library/Python/2.7/site-packages/
或者更一般地说:
chown -R $USER <path to your global pip packages>
在使用
sudo
的情况下运行pip install
是可以接受和安全的吗?
其实这样做并不安全,而且很多人对此表示反对。你可以查看这个链接了解更多:使用 'sudo pip' 的风险是什么?。如果你想在自己的电脑上安装 Python 包,其实并不需要管理员权限。你可以参考这个链接了解 --user
选项的用法:描述。
使用一个虚拟环境:
$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want
只有在你想为全局的系统级Python安装东西时,才需要使用sudo
或者提升权限。
最好使用虚拟环境,这样可以为你隔离软件包。这样你就可以随意尝试,而不会影响全局的Python安装。
另外,使用virtualenv不需要提升权限。