如何猴子修补 "python --version" 命令?

How to monkey patch the "python --version" command?

-v/--version 标志用于打印出相应 python 解释器的版本。

例如,如果 python 是 Python 3.7.9 解释器的别名,则该标志将打印出以下内容:

$ python --version
Python3.7.9

能否创建一个 Python 模块,在安装猴子时为用户修补此命令?需要注意的是,这需要是跨平台的。这样做怎么样?

例如,假设我已经 my-package 上传到 PyPI。如果我安装它,它会修改 pyhton -v/python --version.

的行为
$ python --version
Python3.7.9
$ pip install my-package
...
$ python --version
<some custom text>

最好在卸载时,-v/--version 恢复正常。

我们可以查看 initconfig.c line 1900.

上解析 command-line 参数(在本例中,对于 CPython)的代码

如果提供 --version-V 标志,则 print_version 变为 non-zero 触发条件 line 2051:

if (print_version) {
    printf("Python %s\n",
            (print_version >= 2) ? Py_GetVersion() : PY_VERSION);
    return _PyStatus_EXIT(0);
}

因此,上述模块需要以某种方式修改 PY_VERSION 的值或 Py_GetVersion().

的输出

无法更改 PY_VERSION,因为它是 hard-coded in patchlevel.h

修改Py_GetVersion()的输出也是不可能的since it uses PY_VERSION.

看来答案是否定的,如果不重新编译整个解释器,这是不可能的。