[PATCH 1 of 5] python3.13: use sys.executable instead of removed Py_GetProgramFullPath

Manuel Jacob me at manueljacob.de
Fri Feb 2 00:33:30 UTC 2024


On 12/01/2024 00.59, Mads Kiilerich wrote:
> # HG changeset patch
> # User Mads Kiilerich <mads at kiilerich.com>
> # Date 1705001527 -3600
> #      Thu Jan 11 20:32:07 2024 +0100
> # Branch stable
> # Node ID ab3021e9b0012db64e5bdc70e3f5a36324925d8c
> # Parent  3f87e0d305cda6e66139a1969cd2cedd45477139
> python3.13: use sys.executable instead of removed Py_GetProgramFullPath

According to 
https://docs.python.org/3.13/c-api/init.html#c.Py_GetProgramFullPath, 
it’s only deprecated, but not removed. Do you have other information?

> I could not make it work with the PyConfig API from the extension. But fetching
> sys.executable seems to work fine and isn't that verbose.

I think the PyConfig struct memory is released after interpreter 
initialization, so I think PyConfig is out of question anyway.

https://docs.python.org/3.13/c-api/init.html#c.Py_GetProgramFullPath 
suggests sys.executable as the alternative, so feel to change the patch 
description to be more bold. :)

> diff --git a/mercurial/cext/parsers.c b/mercurial/cext/parsers.c
> --- a/mercurial/cext/parsers.c
> +++ b/mercurial/cext/parsers.c
> @@ -1232,6 +1232,15 @@ static int check_python_version(void)
>   	 * should only occur in unusual circumstances (e.g. if sys.hexversion
>   	 * is manually set to an invalid value). */
>   	if ((hexversion == -1) || (hexversion >> 16 != PY_VERSION_HEX >> 16)) {
> +		PyObject *sys = PyImport_ImportModule("sys"), *executable;
> +		if (!sys) {
> +			return -1;
> +		}
> +		executable = PyObject_GetAttrString(sys, "executable");

You could use PySys_GetObject().

> +		Py_DECREF(sys);
> +		if (!executable) {
> +			return -1;
> +		}
>   		PyErr_Format(PyExc_ImportError,
>   		             "%s: The Mercurial extension "
>   		             "modules were compiled with Python " PY_VERSION
> @@ -1240,7 +1249,8 @@ static int check_python_version(void)
>   		             "sys.hexversion=%ld: "
>   		             "Python %s\n at: %s",
>   		             versionerrortext, hexversion, Py_GetVersion(),
> -		             Py_GetProgramFullPath());
> +		             PyUnicode_AsUTF8(executable));
> +		Py_DECREF(executable);
>   		return -1;
>   	}
>   	return 0;
> 
> _______________________________________________
> Mercurial-devel mailing list
> Mercurial-devel at lists.mercurial-scm.org
> https://lists.mercurial-scm.org/mailman/listinfo/mercurial-devel



More information about the Mercurial-devel mailing list