]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr: set argv for python in PyModuleRegistry
authorKefu Chai <tchaikov@gmail.com>
Sat, 3 Feb 2024 11:49:13 +0000 (19:49 +0800)
committerKefu Chai <tchaikov@gmail.com>
Sun, 4 Feb 2024 08:32:08 +0000 (16:32 +0800)
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 <tchaikov@gmail.com>
src/mgr/PyModule.cc
src/mgr/PyModuleRegistry.cc

index 084cf3ffc1eac44e784b122928c729091f216327..e27c3693f3c85de789e9be5fbccb94adb4ebc444 100644 (file)
@@ -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<std::string>("mgr_module_path") + ':' +
                       get_site_packages() + ':');
index 1fd92b90282903bcc9b2a11c1924d6679788a26f..2370da21e7073e7def54a18fef12f896ff4aa0c0 100644 (file)
@@ -70,6 +70,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<bool>("daemonize")) {
     PyImport_AppendInittab("ceph_logger", PyModule::init_ceph_logger);
@@ -85,6 +90,8 @@ void PyModuleRegistry::init()
   }
   PyImport_AppendInittab("ceph_module", PyModule::init_ceph_module);
   Py_InitializeEx(0);
+  const wchar_t *argv[] = {L"ceph-mgr"};
+  PySys_SetArgv(1, (wchar_t**)argv);
 #endif // PY_VERSION_HEX >= 0x03080000
 #undef WCHAR