为什么我不能在没有 sudo 使用 Python 和 pip 的情况下做一些事情?

Why i can't do some things without sudo using Python and pip?

当我使用 pip 时,如果没有 sudo,它通常无法工作。我经常看到人们在没有 sudo 的情况下使用 pip,那么我做错了什么?

我读到不建议使用 sudo 安装 pip 包。我知道使用 virtualenv 我可以在没有 sudo 的情况下使用 pip,但是要安装 virtualenv 我必须先使用 sudo。

当我尝试在没有 sudo 的情况下安装 pip 时,我得到:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/pip'

尝试使用 pip3 install flask 安装 Flask 时:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/werkzeug'

原因是您的普通用户没有修改系统目录所需的权限。就像这条消息中一样:

PermissionError: [Errno 13] Permission denied: '/usr/local/lib/python3.4/dist-packages/pip'

以下是您需要了解的简要说明:

您的系统已安装 python,要修改系统的 python 您必须使用 sudo 或成为 root 用户。

您可以在不使用 sudo 的情况下在您的主目录中安装 python 库,但只有您(不是系统的其他用户)才能使用它。像 gongzhitaao 提到的那样用 pip install --user package-name 做这个。

您还可以在您选择的目录中创建 python 的独特安装,就像 The Laughing Man 提到的那样。这称为 virtualenv,我认为这是最受欢迎的工作方式。

sudo 在 Unix/Linux 系统中用于作为另一个用户执行任务,使用 他们的 权限,例如写入某些目录的能力。当你没有指定要模拟的用户时,比如 运行ning

sudo pip install flask

您正在尝试以系统管理员身份 运行 命令,在许多环境中称为 root。系统会要求您输入管理员密码(如果您已授予用户管理员权限,则可以是您自己的密码),然后指定命令 运行s as that user ,这意味着它具有 read/write 访问系统上基本上每个文件和目录的权限(有一些例外,但它们大多是极端情况,在这里不是很重要)。这意味着您在使用 sudo 时需要 格外小心 ,因为像单个 space 这样小的错误真的会把事情搞砸:比较

sudo rm -rf /usr/local/lib/python3.4/dist-packages/numpy*

sudo rm -rf /usr /local/lib/python3.4/dist-packages/numpy*

看到 /usrlocal/ 之间的 space 了吗?您刚刚开始删除整个 /usr 文件夹,其中包含系统上的大部分重要文件和程序。希望你有备份!现在,这并不意味着您需要害怕 sudo,但您 确实 需要对它怀有健康的尊重。

Python 安装往往是系统级的(是的,我知道有例外),这意味着你需要使用 sudo 来修改它们,比如安装 3rd-party 模块时pip。如果你运行

ls -l /usr/local/lib/python3.4 

您会看到类似

的内容
drwxrwsr-x 125 root 4096 Nov  3 00:40 dist-packages

显示您尝试使用 pip 安装到的目录归 root 所有,因此需要使用 sudo

现在,有几种解决方法。如果您对此感到满意,并且不介意修改系统的全局包,请继续使用 sudopip(事实上,如果您需要,您可能需要使用 sudo -H ...在开始时收到一条关于您的主目录中的权限的黄色小消息)。您的所有模块都将安装到 /usr/local/lib/python3.4/dist-packages 并可供系统上的所有用户使用。

第二个选项是使用 pip 的 --user 选项,它将在您的主目录 (~) 中创建一个 lib/python3.4/site-packages 层次结构,并将所有已安装的模块以及脚本存储在那里在 ~/bin 中(你应该将其添加到你的 $PATH 中。这种方法的优点是你 不需要 使用 sudo,所以你不会不小心将其他程序需要特定版本的系统相关模块覆盖到运行。缺点是安装的模块只对你可用,所以你可能 运行 问题,例如,如果您的网络服务器试图 运行 Flask 本身,并且无法读取源文件。然而,这不是一点点配置文件编辑所不能做到的。 t fix。这是我为大多数用户推荐的解决方案。

第三种选择是使用像 virtualenv 这样的虚拟环境。这将在您选择的位置创建自定义 Python 安装,具有 单独的 python 可执行文件和 site-packages 层次结构(有关于是否要 link 或使用系统的 dist-packages 存储库)。您可以 pip install 直接打包到 virtualenv 中,并根据您的小心脏的需要创建尽可能多的环境,例如,每个环境的各种依赖项的版本略有不同,这样您就可以更可靠地测试您的程序。您可以打开和关闭虚拟环境,例如,您可以在终端的不同选项卡中设置几个 运行ning,例如,并行测试。这是我的第二名推荐,因为激活和使用环境涉及(稍微)更多的工作,如果您不太擅长命名环境,您可能会对自己在哪个环境中工作感到困惑。缺点包括缺乏系统范围的可用性,如第二个选项,以及虚拟环境需要在使用前手动激活。

因此,请查看这些选项,看看哪个最适合您的系统和您的特定情况。祝你好运!