【问题标题】:Getting "Permission Denied" when running pip as root on my Mac在我的 Mac 上以 root 身份运行 pip 时出现“权限被拒绝”
【发布时间】:2013-02-22 16:21:22
【问题描述】:

我已经开始使用我的 Mac 安装 Python 包,就像在工作中使用我的 Windows PC 一样;但是在我的 Mac 上,我在写入日志文件或站点包时经常遇到 permission denied 错误。

因此我考虑在sudo 下运行pip install <package>,但考虑到我只是希望将其安装在我当前的用户帐户下,这是安全/可接受的使用 sudo 吗?

来自日志文件 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

【问题讨论】:

  • 我发现 'cd /tmp; sudo pip install foo' 是一个合适的解决方法。
  • @pradyunsg 为什么要举报这么老的问题?
  • 本质上,当前接受的答案(以及问题中的更新)建议运行“sudo pip”——pip 的维护者(我自己就是其中之一)积极地告诉人们不要这样做这可能会导致您在 MacOS 和许多(全部?)主要 Linux 发行版上的操作系统崩溃。我登陆这里时使用的术语是有人调试他们的情况可能并且只是想让这将人们重定向到一个有更好建议的位置。没有考虑过实际提出这个问题,它的答案更好地符合上述陈述。 (超出字符)
  • @markwalker_ 您是否愿意从问题中删除该建议并可能用更好的建议(使用 --user 或 virtualenv)替换它?

标签: python macos pip sudo


【解决方案1】:

使用virtual environment

$ virtualenv myenv
.. some output ..
$ source myenv/bin/activate
(myenv) $ pip install what-i-want

当您想为全局、系统范围的 Python 安装安装东西时,您只能使用 sudo 或提升的权限。

最好使用为您隔离包的虚拟环境。这样你就可以在不污染全局 python 安装的情况下玩耍。

另外,virtualenv 不需要提升权限。

【讨论】:

  • 如果他的主目录的权限被弄乱了,使用 virtualenv 不太可能帮助他
  • 是的,它会的,但它已经发生了,所以他需要在继续之前修复它。
  • 谢谢大家,我以前读过关于 virtualenv 的文章,所以希望这两个解决方案一起能让我重回正轨:)
  • 另外,要安装 virtualenv,您需要 sudo... 或者有解决方法吗?
  • 我不明白为什么这是最好的答案。问题不在于虚拟环境。这是关于使用sudo pip install 的有效性。假设我需要安装一些我将在许多项目或系统级别使用的包。比如像pgcli这样的一些CLI工具。显然我不需要虚拟环境,我想全局安装它。我应该使用sudo pip install 还是有一些更正确的做法?就是这个问题。
【解决方案2】:

sudo 下运行pip install 是否可以接受且安全?

这是不安全的,而且不受欢迎 – 请参阅 What are the risks of running 'sudo pip'? 要在您的主目录中安装 Python 包,您不需要 root 权限。请参阅description--user 选项来点子。

【讨论】:

  • 虽然您的解决方案是第一个真正起作用的解决方案,但 @throws_exceptions_at_you 使用实际代码创建了响应,而不是重定向到文档
  • 我做了sudo pip install 不知道使用它的损害。如何撤消此命令或阻止在sudo 下运行?
【解决方案3】:

您最初的问题是 pip 无法将日志写入文件夹。

IOError: [Errno 13] Permission denied: '/Users/markwalker/Library/Logs/pip.log'

您需要 cd 进入一个文件夹,在该文件夹中调用的进程可以像 /tmp 这样写,所以 cd /tmp 并重新调用该命令可能会起作用,但不是您想要的。

但是实际上对于这种特殊情况(您不想使用 sudo 来安装 python 包)并且不需要全局包安装,您可以像这样使用 --user 标志:

pip install --user <packagename>

它会正常工作的。

我假设你有一个单用户 python python 安装并且不想费心阅读virtualenv(这不是很用户友好)或pipenv

正如 cmets 部分的一些人指出的那样,除非您不知道该怎么做并陷入困境,否则下一种方法不是一个好主意:

另一种方法用于全局包,例如在您的情况下,您想要执行以下操作:

chown -R $USER /Library/Python/2.7/site-packages/

或更一般地

chown -R $USER <path to your global pip packages>

【讨论】:

  • -1 更改全局 site-packages 文件夹的所有权是一件很糟糕的事情。 pip 的--user 选项是我的答案中的一个解决方案,当你写你的答案时它已经存在。
  • 我在这里看不到参数。还考虑到提出此类入门级问题的人可能不熟悉 unix 的权限系统,因此运行 1 用户安装并不重要。此外,您的回答实际上无法解决我实际上想要安装到全局包的用例。之后,我可以轻松地将权限恢复为预安装。
  • +1 用于实际编写 整个 命令。有些人认为 OP 知道如何在命令行中实现 option,而他们或其他读者可能不知道。你不同意吗,@PiotrDobrogost?
  • 添加 --user 对我有帮助!
  • 更改系统 Python 的整个site-packages 目录的权限类似于用扳手敲打泵来“修复”泵。它受到保护是有原因的 - 你不应该在那里安装东西真正的 解决方案是不要将系统 Python 发行版与日常编程混为一谈。安装不同的 Python 发行版(来自 Python.org、Homebrew、Canopy 等)。
【解决方案4】:

因为我遇到了同样的问题,所以我想强调的是,Brian Cain 的第一条评论实际上是“IOError:[Errno 13]”问题的解决方案:

如果在临时目录(cd /tmp)中执行,如果我运行sudo pip install foo,则不会再发生 IOError。

【讨论】:

  • 您能否解释一下为什么这可以为您解决问题?
  • 您仍在使用 sudo pip 和这个“解决方案”,因此安装具有 root 权限的软件包,这可能不是您想要的?
  • 我只能猜测为什么会这样:我认为(某些)pip 安装脚本的某些部分需要对当前目录的写入权限,但需要使用不同的用户。因此,如果在您的主目录中执行,它会由于缺少写入权限而神秘地失败。如果从/tmp 中调用它,它会起作用,因为每个人都有那里的写访问权限。
  • 他没有对 '/Users/markwalker/Library/Logs/pip.log' 的写入权限
【解决方案5】:

您的权限似乎搞砸了。在终端中输入chown -R markwalker ~ 并再次尝试pip?让我知道您是否已排序。

【讨论】:

  • 虽然这样可以解决权限问题,但并不能回答问题。
  • 解决我不知道的问题是一种奖励! chown.shsh 等许多隐藏目录上提供Operation not permitted,我认为它正在处理它现在可以设置的文件,但我会看看当 cli 提示返回时会发生什么。
【解决方案6】:

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

执行此操作后,我的终端抱怨:

pip install virtualenvwrapper

所以,我没有成功尝试过这个(不推荐)

sudo pip install virtualenvwrapper

然后,我成功安装了它:

pip install --user virtualenvwrapper

【讨论】:

  • pip 的 --user 选项是作为我的答案中的一个解决方案,当你写你的答案时它已经存在。这应该是评论而不是答案。
  • 您说不推荐,但official installation notes 说可以使用 sudo 安装 virtualenvwrapper。 virtualenv 也是如此。这里提出的问题没有提到这两个,所以我假设这里的所有其他答案都是针对一般 python 包的。
  • 对于未来的读者,由于上述评论,我在回答中删除了我的“不推荐”标志,但我尚未验证它。这就是为什么我还没有删除标志。
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 2012-07-29
相关资源
最近更新 更多