如何猴子修补 "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
.
看来答案是否定的,如果不重新编译整个解释器,这是不可能的。
-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.
如果提供 --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
.
看来答案是否定的,如果不重新编译整个解释器,这是不可能的。