Message313649
Python documentation was enhanced in Python 3.7 to explicitly list all functions safe to call *before* Py_Initialize():
https://docs.python.org/dev/c-api/init.html#before-python-initialization
PySys_AddWarnOption() is not part of the list. While it's not in the list, I'm kind of unhappy that we broke your use case: it wasn't my intent. Because I broken your use case with this change part of the big bpo-32030 refactoring:
commit f7e5b56c37eb859e225e886c79c5d742c567ee95
Author: Victor Stinner <victor.stinner@gmail.com>
Date: Wed Nov 15 15:48:08 2017 -0800
bpo-32030: Split Py_Main() into subfunctions (#4399)
IHMO the regression is that PySys_AddWarnOption() now calls _PySys_GetObjectId(): in Python 3.6, it wasn't the case.
Python 3.6 code:
---
void
PySys_AddWarnOptionUnicode(PyObject *unicode)
{
if (warnoptions == NULL || !PyList_Check(warnoptions)) {
Py_XDECREF(warnoptions);
warnoptions = PyList_New(0);
if (warnoptions == NULL)
return;
}
PyList_Append(warnoptions, unicode);
}
---
Again, it's a bad idea to use the Python API before Py_Initialize(): you likely have to build a Unicode string and you use a list, whereas these two object types are not properly initialized...
The PEP 432 and bpo-32030 prepared Python to have a much better API in Python 3.8 for embedding Python. You will be able to use a wchar_t* string to pass warning options. |
|
Date |
User |
Action |
Args |
2018-03-12 13:33:23 | vstinner | set | recipients:
+ vstinner, htgoebel, ncoghlan, eric.snow |
2018-03-12 13:33:23 | vstinner | set | messageid: <1520861603.18.0.467229070634.issue33042@psf.upfronthosting.co.za> |
2018-03-12 13:33:23 | vstinner | link | issue33042 messages |
2018-03-12 13:33:23 | vstinner | create | |
|