【问题标题】:How to execute Python Code on Interpreter Startup in Virtualenv?如何在 Virtualenv 的解释器启动时执行 Python 代码?
【发布时间】:2017-03-21 23:06:52
【问题描述】:

我想在 python 解释器启动后执行代码。

我们使用 virtualenv,到目前为止,我们有一个名为 sitecustomize.py 的文件,它在解释器启动期间执行。

sitecustomize.py 是我们项目的一部分。我们使用这个术语的 Django 定义:它是一个只包含配置而几乎没有代码的小型 python 模块:Django's Definition of "Project"

不幸的是,一些 linux 发行版 (Ubuntu) 提供了一个全局站点自定义,而我们的每个 virtualenv 站点自定义没有被加载。

问题

如何在 virtualenv 中的解释器启动时运行 Python 代码?

即使交互式解释器启动,也应该执行此代码。

目标与策略

我不在乎这个钩子是否被称为“sitecustomize”或不同的:-)

【问题讨论】:

  • 你可以将你的代码(运行python脚本的bash)放在bin/activate....的底部
  • @danidee AFAIK 如果您通过setup.py 创建console_script,这将不起作用。 virtualenv 的 python 解释器被使用,但 bin/active 脚本没有被执行。

标签: python django virtualenv setup.py pth


【解决方案1】:

@guettli 回答的补充:您甚至可以将 .pth 文件作为软件包分发的一部分,因此在安装它时,它会使一些代码在 python 启动时运行,当它被卸载时,此代码将不再运行。

示例包:

  • startup.pth
  • setup.py

startup.pth的内容:

import sys; print('Success!!')

setup.py的内容:

from setuptools import setup

setup(
    name='pth_startup_example',
    data_files=[
        ('.', ['startup.pth'])
    ]
)

创建这些文件后,在与文件相同的目录中运行pip install .。 这应该在你的根 python 目录中安装startup.pth,并且你应该在每次解释器运行时看到Success!! 打印。 要撤消此操作,请运行 pip uninstall pth_startup_example

您可以将它添加到现有包中,或使这样的包成为不同包的依赖项。

【讨论】:

    【解决方案2】:

    您可以使用此答案中解释的 pth 文件:

    https://stackoverflow.com/a/52555465/633961

    一个 pth 文件在解释器执行其输入的第一行之前被加载。

    【讨论】:

      【解决方案3】:

      使用usercustomize

      在某些 linux 发行版上存在全局 sitecustomize,而在某些不存在。

      这可能会导致令人困惑的行为。

      没有 linux 发行版提供用户自定义。

      site

      ...在此之后,尝试导入名为 usercustomize 的模块,如果 ENABLE_USER_SITE 为 true,该模块可以执行任意用户特定的自定义。

      【讨论】:

      • usercustomize 对于尚未使用 --system-site-packages 创建的 virtualenvs 被明确禁用。有什么建议该怎么做吗?
      • @ingomueller.net 我创建了第二个答案。您可以使用 pth 文件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      相关资源
      最近更新 更多