【问题标题】:How to monkey patch the "python --version" command?如何修补“python --version”命令?
【发布时间】:2020-08-30 15:49:00
【问题描述】:

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

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

$ python --version
Python3.7.9

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

例如,假设我在 PyPI 上上传了 my-package。如果我安装了它,它会修改pyhton -v/python --version的行为。

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

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

【问题讨论】:

  • 为什么需要这个功能?
  • 进入 Austin Power “我也喜欢危险地生活” GIF
  • @Andy_ye 有一个想法使用一些 ASCII art I made 和 FIGlet 字体来美化输出哈哈。

标签: python pip command-line-interface setuptools monkeypatching


【解决方案1】:

我们可以查看initconfig.c line 1900 上解析命令行参数的代码(在此示例中,用于 CPython)。

如果提供了--version-V 标志,则print_version 变为非零,从而触发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

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

【讨论】:

  • 那是一个伟大而简洁的解释——非常感谢 :)
猜你喜欢
  • 1970-01-01
  • 2019-06-20
  • 2017-07-26
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多