commit 07773617f339a2779aa7cf910c0361c937ffe4c2 Author: Kefu Chai Date: Sat Feb 3 19:49:13 2024 +0800 mgr: set argv for python in PyModuleRegistry before this change, we setup the progname for Python interpreter, but setup the argv for it in PyModule. and we are using deprecated API to initialize Python interpreter. in this change, let's do this in a single place for better maintainability. also, take this opportunity, to use the non-deprecated API to initialize interpreter on Python >= 3.8. this silence the warning when compiling ceph-mgr with CPython 3.12: ``` /var/ssd/ceph/src/mgr/PyModule.cc: In member function ‘int PyModule::load(PyThreadState*)’: /var/ssd/ceph/src/mgr/PyModule.cc:363:20: warning: ‘void PySys_SetArgv(int, wchar_t**)’ is deprecated [-Wdeprecated-declarations] 363 | PySys_SetArgv(1, (wchar_t**)argv); | ~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~ In file included from /usr/include/python3.12/Python.h:96, from /var/ssd/ceph/src/mgr/BaseMgrModule.h:4, from /var/ssd/ceph/src/mgr/PyModule.cc:14: /usr/include/python3.12/sysmodule.h:13:38: note: declared here 13 | Py_DEPRECATED(3.11) PyAPI_FUNC(void) PySys_SetArgv(int, wchar_t **); | ^~~~~~~~~~~~~ ``` Signed-off-by: Kefu Chai diff --git a/src/mgr/PyModule.cc b/src/mgr/PyModule.cc index 0591e2c7145..a723b1ebd55 100644 --- a/src/mgr/PyModule.cc +++ b/src/mgr/PyModule.cc @@ -357,10 +357,6 @@ int PyModule::load(PyThreadState *pMainThreadState) return -EINVAL; } else { pMyThreadState.set(thread_state); - // Some python modules do not cope with an unpopulated argv, so lets - // fake one. This step also picks up site-packages into sys.path. - const wchar_t *argv[] = {L"ceph-mgr"}; - PySys_SetArgv(1, (wchar_t**)argv); // Configure sys.path to include mgr_module_path string paths = (g_conf().get_val("mgr_module_path") + ':' + get_site_packages() + ':'); diff --git a/src/mgr/PyModuleRegistry.cc b/src/mgr/PyModuleRegistry.cc index 0d2650d6e59..8ef532c8662 100644 --- a/src/mgr/PyModuleRegistry.cc +++ b/src/mgr/PyModuleRegistry.cc @@ -69,6 +69,11 @@ void PyModuleRegistry::init() PyStatus status; status = PyConfig_SetString(&py_config, &py_config.program_name, WCHAR(MGR_PYTHON_EXECUTABLE)); ceph_assertf(!PyStatus_Exception(status), "PyConfig_SetString: %s:%s", status.func, status.err_msg); + // Some python modules do not cope with an unpopulated argv, so lets + // fake one. This step also picks up site-packages into sys.path. + const wchar_t* argv[] = {L"ceph-mgr"}; + status = PyConfig_SetArgv(&py_config, 1, (wchar_t *const *)argv); + ceph_assertf(!PyStatus_Exception(status), "PyConfig_SetArgv: %s:%s", status.func, status.err_msg); // Add more modules if (g_conf().get_val("daemonize")) { PyImport_AppendInittab("ceph_logger", PyModule::init_ceph_logger);