【问题标题】:Permission error with pip Python 3pip Python 3的权限错误
【发布时间】:2018-03-22 09:18:45
【问题描述】:

我在 Mac OS X 上使用 Python 3。一切都很完美,我曾经安装过这样的包:

pip install somePackage

但是 IDLE 停止工作,所以我不得不重新安装它。之后,当我运行 pip 时,我得到了pip is not defined,所以我不得不安装 pip。现在,每次我尝试使用 pip 安装软件包时,都会收到此错误:

Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/install.py", line 342, in run
    prefix=options.prefix_path,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 784, in install
    **kwargs
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 851, in install
    self.move_wheel_files(self.source_dir, root=root, prefix=prefix)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 1064, in move_wheel_files
    isolated=self.isolated,
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 377, in move_wheel_files
    clobber(source, dest, False, fixer=fixer, filter=filter)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/wheel.py", line 287, in clobber
    ensure_dir(dest)  # common for the 'include' path
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/utils/__init__.py", line 83, in ensure_dir
    os.makedirs(path)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/os.py", line 157, in makedirs
    mkdir(name, mode)
OSError: [Errno 1] Operation not permitted: '/System/Library/Frameworks/Python.framework/Versions/2.7/include/python2.7/pygame'

我认为它可能来自版本,所以我更新了它。现在,每当我运行 pip install something 时,我都会收到此错误:

Command "/usr/bin/python -u -c "import setuptools, tokenize;file='/private/var/folders/bc/hwpn9sqn5352xcbst0p89snm0000gn/T/pip-build-hSNyxK/ termcolor/setup.py';f=getattr(tokenize, 'open', open)(file);code=f.read().replace('\r\n', '\n ');f.close();exec(compile(code, file, 'exec'))" install --record /var/folders/bc/hwpn9sqn5352xcbst0p89snm0000gn/T/pip-U3ZtNq-record /install-record.txt --single-version-externally-managed --compile" 失败,错误代码 1 在 /private/var/folders/bc/hwpn9sqn5352xcbst0p89snm0000gn/T/pip-build-hSNyxK/termcolor/

我什至无法删除一个包 - 当我运行 pip uninstall something 时出现此错误:

Exception:
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/commands/uninstall.py", line 76, in run
    requirement_set.uninstall(auto_confirm=options.yes)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_set.py", line 346, in uninstall
    req.uninstall(auto_confirm=auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_install.py", line 754, in uninstall
    paths_to_remove.remove(auto_confirm)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/req/req_uninstall.py", line 115, in remove
    renames(path, new_path)
  File "/Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg/pip/utils/__init__.py", line 267, in renames
    shutil.move(old, new)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 302, in move
    copy2(src, real_dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 131, in copy2
    copystat(src, dst)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 103, in copystat
    os.chflags(dst, st.st_flags)
OSError: [Errno 1] Operation not permitted: '/var/folders/bc/hwpn9sqn5352xcbst0p89snm0000gn/T/pip-OQKY_a-uninstall/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/numpy-1.8.0rc1-py2.7.egg-info'

我的 pip 版本是:

pip 9.0.1 from /Library/Python/2.7/site-packages/pip-9.0.1-py2.7.egg (python 2.7)

我使用的是 Mac 10.12.6

我该如何解决这个问题?

【问题讨论】:

  • 作为 sudo 执行
  • Sudo pip somepackage?
  • 你能否包含来自命令行的$ which python 和来自Python 的>>> import site; site.getsitepackages() 的输出?另外,请提及您正在使用的 Python 发行版(系统版本、Python.org 版本、Homebrew 版本、Anaconda 等)?

标签: python macos python-3.x terminal pip


【解决方案1】:

您看到的权限错误是由于您的site-packages 目录(pip 尝试安装到的目录)受到管理员的保护和拥有。

站点包目录在哪里

这取决于您的 Python 发行版。这就是为什么我要求您包含$ which python 命令(来自命令行)和>>> import site; site.getsitepackages() 命令(来自Python)的输出。这些将帮助您确定您的站点包目录在哪里。此外,运行 pip -v 将打印 pip 尝试安装的目录。

请务必注意,Mac 带有 Python 的系统版本。您不应安装此系统版本的 Python 可访问的任何包,因为它由系统使用,您可能会干扰其正常工作和/或安装恶意版本的包,这些包会在系统使用该 Python 时做坏事(例如,如果有人制作了一个讨厌的鸡蛋并将其命名为“os”并将其放在您的系统 Python 的站点包目录中,那么下次系统 python 版本运行“import os”时它将导入讨厌的鸡蛋。)

为什么用sudo pip install 覆盖不是一个好的解决方案

虽然以 sudo 运行 pip install 命令会可能解决问题,但由于我在评论中提到的原因,这是一个非常糟糕的短期修复在@Nenand 的回答中-运行pip install X 从互联网上下载X 的鸡蛋,并在setup.py 中的任何内容上运行python setup.py build && python setup.py install。虽然很容易陷入自满情绪,因为,嘿,它有效!,信任互联网上的陌生人 也很天真(让我们面对现实吧,制作 pip 包的人 是 em> 对你来说是陌生人)。

编辑:我什至没有想到这一点,但也有可能你输入错误的库,或者猜错名称,然后结束找到一个你真的不想要的(排版)。请参阅this BleepingComputer 关于域名仿冒 pip 包的文章。

正确的解决方案

正确的解决方案是找出为什么您的 site-packages 目录受到保护,然后修复其权限,或者更改 pip 正在使用的 site-packages 目录。

我怀疑您看到此权限错误的原因是 pip 试图安装到系统 Python 的 site-packages 目录,该目录由 root 拥有是有充分理由的。系统Python位于/usr/bin/,其site-packages目录位于以下目录:

'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages'
'/System/Library/Frameworks/Python.framework/Versions/2.7/lib/site-python'
'/Library/Python/2.7/site-packages'

在这种情况下,我的建议是使用 Homebrew、Python.org 或 Canopy 安装 Python,这会将您的蛇放在单独的笼子中,并且不会单独使用 Python 系统。在我的系统上,python 是系统 python,python2 是 Python 版本 2,python3 是 Python 版本 3。这也让我更清楚我使用的是哪个版本。我也没有pip 命令——不在我的路径上——所以我不能不小心在我的系统 Python 中安装一些东西。我必须明确调用pip2pip3。使用 Homebrew Python 将为您完成所有这些工作,因此这是我在众多可用的 Python 发行版中最喜欢的建议。

【讨论】:

  • 非常感谢,我真的很感激。我从 python.org 安装了 Python。我怎么能像你一样?我应该卸载所有 python 版本并 pip 然后使用 Homebrew 重新安装它吗?还有一件事,虚拟环境会解决这个问题并按照您的方式做某事还是为了其他事情?
  • 我很高兴您提到了虚拟环境,因为我忘了在我的回答中提及这些。 virtualenv 包的发明是为了避免这种 Python 和库的纠结。但是,您仍然必须在某处安装 virtualenv 包,如果您使用的是系统 Python,它不是最佳的(Python 的系统版本会更旧,因为它与您的计算机捆绑在一起)。因此,在您选择了 Python 发行版并将其整理好之后,请使用 virtualenv。
  • 至于使用哪个发行版,如果您没有特定理由坚持使用 Python.org 的 Python,我建议您切换到 Homebrew(它与其他混合 C++ 的软件包有很好的集成/Python,与 TensorFlow 和 Numpy 一样,还可以为每个单独的 Python 版本管理自己的环境变量,因此您最终不会陷入混淆 $PYTHONPATH 位置和不兼容模块的地狱)。但是您可以(在理论上)通过仔细的 .bash_profile 编辑和一致使用 virtualenv 来实现对任何发行版的多个版本的相同干净分离。
猜你喜欢
  • 2016-09-29
  • 2016-01-01
  • 2020-08-08
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-11
  • 2012-05-23
  • 2020-08-18
相关资源
最近更新 更多