【问题标题】:Global and local python installations, and accidentally running a requirements file outside of virtualenv全局和本地 python 安装,以及意外在 virtualenv 之外运行需求文件
【发布时间】:2015-06-19 09:20:41
【问题描述】:

所以我在谷歌上搜索了一个 pip 需要 sudo 权限的事件,我遇到了以下两个线程 What are the risks of running 'sudo pip'?Is it acceptable & safe to run pip install under sudo?

第一个线程讨论了使用 pip 运行未知 .py 文件的安全风险(有道理),但从第二个线程我几乎得到的印象是存在一个全局和本地 python 安装,你不应该混淆.我想这是有道理的,你可以为所有用户进行全局安装,然后为每个用户添加一个本地包的附加路径,但这是真的吗? (这也是有道理的,因为 ubuntu(我正在使用)依赖于某些 python 包,所以拥有一个全局根保护的 python 目录可以保护这些)。但是,如果这是真的,我找不到两个单独的目录。我试过了

import sys 
print(sys.path)

同时使用 sudo 和不使用 sudo,我得到了完全相同的目录。

无论如何,我想我会转向 pip virtualenv,但在这种情况下,我想知道,如果我不小心忘记激活环境并在外面运行一个奇异的 requirements.txt 会发生什么?那不会破坏我努力保持清洁的标准用户目录(如果是这样,那是可恢复的吗?我只是在想,它只是忘记输入一个突击队员,然后你的 python 安装就搞砸了.)

【问题讨论】:

  • 它相当简单:不要忘记激活你的 virtualenv。是的,如果你运行一个奇异的 requirements.txt,它可能会污染你的 python 安装。开始项目之前的第一步是创建一个单独的文件夹,并在其中创建一个带有所需 python 版本的 virtualenv。
  • 我只是在想,它只是忘记输入一个命令,然后你的 python 安装就搞砸了。 不是真的。您现在可能很清楚,您不应该将 sudo 与 pip 一起使用,以避免破坏您的 system-wide Python 安装。如果您不将 sudo 与 pip 一起使用,那么无论您安装什么,都不会弄乱您的系统。另外,您可能想阅读我最近添加到我的答案中的this 信息。

标签: python virtualenv requirements.txt


【解决方案1】:

我确实建议始终使用 virtualenv 来满足特定应用程序的特定要求。您作为开发人员用于多个项目的工具(例如ipdb)可以在系统上全局安装。

请注意,所有 pip 包都是开源的,因此您可以确保著名的 pip 包可能没有恶意代码,但当然可能包含安全漏洞。

为防止意外在 virtualenv 之外安装 pip 包,您可以将其添加到您的 .bashrc

export PIP_REQUIRE_VIRTUALENV=true

当你在 virtualenv 之外运行 pip install something 时,它会显示一条错误消息:

Could not find an activated virtualenv (required).

如果您仍然希望能够在 virtualenv 之外安装 pip 包,您可以在 .bashrc 中添加一个函数,如下所示:

syspip() {
    PIP_REQUIRE_VIRTUALENV="" pip "$@"
}

然后你可以运行syspip install something 在你的系统上全局安装一些东西。

至于你正在运行的脚本:

import sys 
print(sys.path)

是否使用 sudo 运行它并不重要,sudo 只会更改您执行命令的用户权限,对于此脚本无关紧要。

【讨论】:

  • 是否使用 sudo 运行并不重要,sudo 只会更改您执行命令的用户权限,对于此脚本无关紧要。 不正确。 Sudo 经常改变环境,包括PATH,这在这里很重要。见Does sudo a command temporarily change $PATH to be the root's?
  • @PiotrDobrogost 这个和bash环境变量$PATH不一样,见文档:docs.python.org/3.7/library/sys.html#sys.path
  • 我很清楚sys.path 是什么。但是,由于它取决于您运行的 Python,它也取决于 $PATH(如果您没有指定解释器的确切路径)。
【解决方案2】:

运行sudo pip install <package> 会将包安装到系统范围的包集,通常存储在/usr/lib/python2.7/site-packages 之类的地方。

在没有激活 virtualenv 的情况下运行 pip install package 将尝试将软件包安装到同一个位置,但是因为(如果您的系统配置正确/正确)您将没有对该文件夹的写入权限,安装命令将失败.

如果您绝对必须全局安装,如果可以进行全局安装,通常最好使用分发包,因为这样您可以获得自动更新的好处。然而,正如您所了解的,最好不要全局安装软件包,而是使用 virtualenvs

【讨论】:

    猜你喜欢
    • 2016-11-04
    • 2012-03-16
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2016-03-01
    • 2021-09-27
    相关资源
    最近更新 更多