embedding.cpp 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #define PY_SSIZE_T_CLEAN
  2. #include <Python.h>
  3. #include "embedding.h"
  4. #include <util/generic/ptr.h>
  5. #include <util/generic/yexception.h>
  6. namespace NPyBind {
  7. #if PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
  8. class TDeleteRawMem {
  9. public:
  10. template <typename T>
  11. static inline void Destroy(T* t) noexcept {
  12. PyMem_RawFree(t);
  13. }
  14. };
  15. template <typename T>
  16. using TRawMemHolder = THolder<T, TDeleteRawMem>;
  17. static void SetProgramName(char* name) {
  18. TRawMemHolder<wchar_t> wideName(Py_DecodeLocale(name, nullptr));
  19. Y_ENSURE(wideName);
  20. Py_SetProgramName(wideName.Get());
  21. }
  22. #endif
  23. TEmbedding::TEmbedding(char* argv0) {
  24. #if PY_MAJOR_VERSION < 3
  25. Py_SetProgramName(argv0);
  26. Py_Initialize();
  27. #elif PY_MAJOR_VERSION >= 3 && PY_MINOR_VERSION >= 8
  28. PyStatus status;
  29. PyConfig config;
  30. PyConfig_InitPythonConfig(&config);
  31. // Disable parsing command line arguments
  32. config.parse_argv = 0;
  33. status = PyConfig_SetBytesString(&config, &config.program_name, argv0);
  34. if (PyStatus_Exception(status)) {
  35. PyConfig_Clear(&config);
  36. Py_ExitStatusException(status);
  37. }
  38. status = Py_InitializeFromConfig(&config);
  39. if (PyStatus_Exception(status)) {
  40. PyConfig_Clear(&config);
  41. Py_ExitStatusException(status);
  42. }
  43. PyConfig_Clear(&config);
  44. #elif PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION < 8
  45. SetProgramName(argv0);
  46. Py_Initialize();
  47. #endif
  48. }
  49. TEmbedding::~TEmbedding() {
  50. Py_Finalize();
  51. }
  52. }