在我的Mac上以root身份运行pip时出现“Permission Denied”错误

129
我已经开始使用我的Mac来安装Python包,就像我在工作中使用Windows PC一样;但是,在我的Mac上,当写入日志文件或site-packages时,我经常遇到permission denied错误。
因此,我考虑在sudo下运行pip install <package>,但考虑到我只想将其安装在当前用户帐户下,这样做是否安全/可接受?
日志文件I/O错误的示例回溯:
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


13
我发现 'cd /tmp; sudo pip install foo' 是一个足够的解决方法。 - Brian Cain
1
可能是运行'sudo pip'的风险是什么?的重复问题。 - pradyunsg
@pradyunsg 为什么要标记这样一个老问题? - markwalker_
3
本质上,当前被接受的答案(和问题中的更新)建议运行“sudo pip”——这是pip维护者(我也是其中之一)正在积极告诉人们不要做的事情,因为在macOS和许多(所有?)主要的Linux发行版上这可能会导致操作系统崩溃。我在使用某些调试情况时着陆在这里,只是想让这个问题重定向到一个更好的建议位置。没有考虑实际上将这个问题及其答案与上述声明更加吻合。(字符已用完) - pradyunsg
太棒了!谢谢 @markwalker_。祝你有美好的一天! :) - pradyunsg
显示剩余6条评论
6个回答

110
使用虚拟环境
$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

只有当您想要为全局系统范围的Python安装安装软件时,才需要使用sudo或提升的权限。

最好使用虚拟环境来隔离软件包。这样,您可以在不污染全局Python安装的情况下进行实验。

作为奖励,virtualenv不需要提升的权限。


2
如果他的主目录权限出现问题,使用virtualenv可能无法帮助他。 - hd1
1
是的,它会影响,但这已经发生了,所以他需要在继续之前修复它。 - hd1
1
谢谢大家,我之前已经了解过virtualenv,希望这两个解决方案一起能让我重新回到正轨 :) - markwalker_
1
另外,安装virtualenv需要使用sudo命令...或者有其他解决方法吗? - jimijazz
24
我不明白为什么这是最佳答案。问题不是关于虚拟环境的,而是关于使用 sudo pip install 的有效性。假设我需要安装一些在多个项目或系统级中都会用到的软件包,比如像 pgcli 这样的 CLI 工具。显然我不需要一个虚拟环境,我想要在全局安装它。我应该使用 sudo pip install,还是有其他更正确的做法?这就是问题所在。 - Alex Belyaev
显示剩余2条评论

49
在使用sudo时运行pip install是不安全的,而且这种做法已经不被推荐了。可以参考这里了解相关风险。 如果要在用户目录中安装Python包,您不需要root权限,可以查看--user选项的说明文档

尽管你的解决方案是第一个真正起作用的,但 @throws_exceptions_at_you 创建了一个带有实际代码而不是重定向到文档的响应。 - Edenshaw
1
我之前使用了 sudo pip install 命令,但并不知道它可能会造成的损害。我该如何撤销这个命令或者阻止在 sudo 权限下运行? - Emre Değirmenci

28
您的原始问题是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>

9
更改全局 site-packages 文件夹的所有权是一件糟糕的事情。在您撰写答案时,已存在解决方案中给出了 pip 的 --user 选项。 - Piotr Dobrogost
1
我在这里没有看到任何争论。而且考虑到一个提出如此入门级问题的人可能不熟悉Unix的权限系统,因此运行一个1用户安装也无关紧要。另外,你的答案实际上未能解决我真正想要安装到全局包的用例。在那之后,我可以轻松地将权限恢复到安装前的状态。 - throws_exceptions_at_you
2
+1 如果实际上编写了整个命令。有些人假设OP知道如何在命令行中实现选项,而他们或其他读者可能不知道。你同意吗,@PiotrDobrogost? - Let Me Tink About It
加上 --user 会有帮助! - Honghao Z
3
更改系统 Python 的整个 site-packages 目录的权限,类似于用扳手敲打泵以"修复"它。该目录受到保护,这是有原因的 - 您不应该在那里安装东西。真正的解决方案不是混合使用系统 Python 发行版和日常编程。安装不同的 Python 发行版(来自Python.org,Homebrew,Canopy等)。 - charlesreid1
我只能使用带有sudopip来安装软件包,而更改全局site-packages的所有权对我有所帮助,尽管我知道这是相当残酷的行为。 ;) - loved.by.Jesus

10

因为我曾经遇到同样的问题,我想强调实际上Brian Cain的第一条评论是解决"I0Error: [Errno 13]"问题的解决方案:

如果在临时目录(cd /tmp)中执行,则使用sudo pip install foo运行时不再出现IOError问题。


2
你能否解释一下为什么这个方法对你有用吗? - Chris
8
你仍然在使用sudo pip来执行这个“解决方案”,以root权限安装软件包,这可能不是你想要的。 - Chris
我只能猜测这为什么有效:我认为某些 pip 安装脚本的一部分需要对当前目录进行写访问,但使用不同的用户。因此,如果在您的主目录中执行它,由于缺少写访问权限,它会神秘地失败。如果从 /tmp 中调用它,则可以工作,因为每个人都有写访问权限。 - Edgar
他没有对 '/Users/markwalker/Library/Logs/pip.log' 的写入权限。 - throws_exceptions_at_you

5

看起来你的权限有问题。在终端中输入chown -R markwalker ~,然后再尝试使用pip?如果解决了,请告诉我。


虽然这可能解决权限问题,但它并没有回答问题。 - Burhan Khalid
2
解决我不知道存在的问题是一个奖励!chown在许多像.shsh这样的隐藏目录上给出了“操作不允许”的错误,我猜它现在正在处理可以设置的文件,但当cli提示返回时我会看看会发生什么。 - markwalker_

5

我在成功安装virtualenv后,安装virtualenvwrapper时遇到了问题。

我运行了以下命令后,终端报错:

pip install virtualenvwrapper

所以,我曾尝试过这个(不推荐)

sudo pip install virtualenvwrapper

然后,我使用以下方法成功安装它:
pip install --user virtualenvwrapper

在我的回答中,pip的--user选项被提供作为解决方案,而当你写下你的回答时,这个选项已经存在了。这应该是一个评论而不是一个答案。 - Piotr Dobrogost
你说不建议使用sudo安装virtualenvwrapper,但是官方安装说明中却说可以使用sudo安装。virtualenv也是一样的情况。这个问题没有涉及到这两个包,所以我认为这里所有其他答案都是针对一般的Python包的。 - mehmet
给未来的读者,我在我的回答中划掉了“不推荐”的标记,因为上面的评论,但我还没有验证它。这就是为什么我还没有删除该标记。 - Let Me Tink About It

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接