gpt4 book ai didi

python - 如何在包安装期间测试 Python 是否从 virtualenv 运行

转载 作者:太空狗 更新时间:2023-10-30 00:41:17 25 4
gpt4 key购买 nike

我有一个 Python 软件,其中包含一个配置文件和一个联机帮助页。要安装这些,我的 setup.py 中有以下行(如 http://docs.python.org/2/distutils/setupscript.html#installing-additional-files 中所述):

data_files = [('/etc/foo', ['foo.conf']), ('/usr/share/man/man1', ['foo.1'])]

当我想以 root 身份使用 python setup.py install 安装软件时,这工作得很好,但在 virtualenv 中当然会失败,因为不允许用户写入 /etc/usr/share/man

解决该问题的最佳做法是什么?在当前环境中检查 VIRTUAL_ENV 并且根本不安装这些文件?该软件将在本地目录中查找 foo.conf,因此应该没有问题。用户会错过联机帮助页,但无论如何都没有安装它的明智方法,因为 man 不会在 virtualenv 附近的任何地方寻找它。

最佳答案

最终看来您的问题实际上是关于如何检测正在运行的 Python 是否在 virtualenv 中。要弄清楚这个问题,我们必须了解 virtualenv 的实际工作原理。

当你在 virtualenv 中运行 activate 脚本时,它会做两件事:

  • 它更新 PATH 环境变量以包含来自 virtualenv 的 bin 目录,这样当您运行 python 时,来自 virtualenv 的二进制文件将运行。
  • 它设置了一个变量 VIRTUAL_ENV 以便激活脚本本身可以跟踪激活。

直接从 virtualenv 运行 python 是完全可以接受的,并且在运行时 python 根本不使用 VIRTUAL_ENV 变量。相反,它确定包含正在运行的 python 二进制文件的目录,并使用父目录作为其“前缀”。

您可以通过导入sys 模块并引用sys.prefix 来确定系统的前缀。但是,当 virtualenv 激活时,依赖此值将是一个坏主意,因为这是 Python 的构建时设置,可以轻松自定义,并且肯定会有所不同平台。

但是,当 Python 从 virtualenv 前缀运行时与其编译前缀运行时,Python 确实有 一个 轻微的运行时差异:sys 包有一个额外的变量 real_prefix 返回编译到 Python 二进制文件中的前缀。因此,可以使用它来识别 Python 在非默认位置运行,这很可能意味着它是从 virtualenv 运行的:

import sys

if getattr(sys, "real_prefix", None) is not None:
print "Maybe in a virtualenv"
else:
print "Probably not in a virtualenv"

然而,即使这不是一门精确的科学。所有这一切真正告诉你的是 python 二进制文件不在编译时指定的位置。它不会告诉您当前用户是否有权写入 /usr/share/man - 在某些(可能是边缘)情况下,这不会给您正确的答案:

  • 如果用户从他的主目录中的源代码编译了他自己的 Python,并且其编译前缀是 /home/johnd/local-python 那么 real_prefix 获胜未设置,但用户仍有对其 Python lib 目录的写入权限,并且可能没有/etc 的写入权限/usr/share/man

  • 同样,在某些系统上,管理员可能已将 /usr/lib/python2.7 的组写入权限授予特定的应用程序开发人员组,以便他们可以安装 Python 模块,但未授予他们对其他系统文件的写入权限。

所以我认为最后你能做的最好的事情就是启发式,最好避免在 data_files 中为你希望在 virtualenv 中使用的任何模块使用绝对路径。一种妥协可能是将您的模块简单地分成两个分布,一个代表可本地化的源文件,另一个代表系统范围的配置以使其运行。后者可以依赖于前者,因此用户仍然可以轻松安装它,但是那些使用 virtualenv 的用户可以选择直接使用另一个前者。

关于python - 如何在包安装期间测试 Python 是否从 virtualenv 运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15466253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com