【问题标题】:Pythonic way to handle config file installation when in a virtualenv?在 virtualenv 中处理配置文件安装的 Pythonic 方式?
【发布时间】:2016-12-24 17:33:01
【问题描述】:

假设我正在从 setup.py 安装一个 python 应用程序,并在 virtualenv 中这样做。另外,假设我需要提供对应用程序敏感的配置,例如 API 密钥/URI。

我的 virtualenv 可能在如下路径中:

/opt/appname/venv

我相信我希望能够安装一个默认配置文件,以便应用程序的用户在成功执行之前进行修改。

默认示例可能会安装到:

/etc/appname/config.sample

问题是,如果我在 virtualenv 中,setup.py / setuptools 真的不处理安装到全局路径(据我所知)。

处理这种相当常见的场景的最佳 Python 方法是什么?

【问题讨论】:

  • 你的问题有点含糊。你在说什么全局路径。一个具体的例子将非常有用。请edit您的问题并提供此信息。
  • 我觉得一点也不含糊。一个具体的例子是不可能的,因为这是一个pythonic风格的问题。
  • 您是否考虑过替代安装选项? docs.python.org/3/install/index.html#alternate-installation
  • 尽我所能告诉安装后脚本是最好的前进路径,这就是我正在做的事情。我为此使用 RPM。 Python 打包在核心功能方面还有很多不足之处。
  • 另一种选择是在您的 python 环境中使用打包程序。我也看过 cython 风格的解决方案,但解决依赖关系非常难看。 =/ python真的不擅长被打包……还是这样。

标签: python pip virtualenv setuptools packaging


【解决方案1】:

假设配置文件更改了虚拟环境变量,这就是为什么必须在启动虚拟环境之前对其进行修改,那么您可以修改位于./venv/bin 中的activate bash 脚本来完成此操作。因此,如果您想从配置文件中添加全局路径,那么activate 中的最后一行可能是:

MY_GLOBAL_PATH=<program that looks into config file and returns path>

然后可以像往常一样激活虚拟环境:

source ./venv/bin/activate

【讨论】:

  • 我喜欢让我的 python 应用程序对文件系统(包括配置文件)尽可能地幼稚,而是使用环境变量。当使用虚拟环境和使用方法os.getenv 时,我发现这是一个非常干净的范例。我通过使用 pyvenv 创建的“VIRTUAL_ENV”变量在项目目录中查找文件或使用包含项目目录之外的配置文件位置的附加 bash 变量脚本来完成此操作。如果你想使用更少的 bash 和更多的 python,你可以使用os 模块来设置和获取环境变量。
  • cfm 允许以集中管理的方式干净利落地部署配置文件。特别有用的是加密数据包/保险库等实用程序,用于动态/安全地记录 API 密钥等。环境变量可能很危险,因为更容易发生命名空间冲突。恕我直言。
【解决方案2】:

您是否尝试过使用 Python 的 site-specific configuration 选项?在我看来,.pth 文件和sitecustomize.py 文件可能会有所帮助。
另见:Accepted answer on "Using .pth files"

如果没有更具体的示例来说明您所指的那种“全局路径”,就很难给出可能会做什么的更精确的细节——即使这在某种程度上是一个普遍的风格问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2011-01-21
    • 2018-11-12
    • 2013-04-25
    • 2012-05-15
    • 2011-08-24
    • 1970-01-01
    相关资源
    最近更新 更多