🛰️航天仿真算法库 SpaceAST 0.3.1
载入中...
搜索中...
未找到
PythonAPI.hpp
浏览该文件的文档.
1
21
22#pragma once
23
24#include "AstGlobal.h"
25#include <mutex>
26#include <vector>
27#include <string>
28#include <array>
29
30#ifndef SWIG // PythonAPI 为内部实现类,不暴露给 SWIG
31
32// Python 类型前置声明(不依赖 Python.h,保证动态加载场景下的编译独立性)
33struct _object;
34typedef struct _object PyObject;
35
36
37AST_NAMESPACE_BEGIN
38
39
48class AST_SCRIPT_API PythonAPI
49{
50public:
51 // 函数索引
52 enum{
53 iPy_Initialize = 0,
54 iPy_FinalizeEx,
55 iPy_IsInitialized,
56 iPyRun_SimpleString,
57 iPyImport_ImportModule,
58 iPyObject_GetAttrString,
59 iPyObject_CallObject,
60 iPy_DecRef,
61 iPy_IncRef,
62 iPyErr_Print,
63 iPyErr_Occurred,
64 iPyUnicode_AsUTF8,
65 iPyRun_String,
66 iPyLong_AsLong,
67 iPyFloat_AsDouble,
68 iPyLong_FromLong,
69 iPyFloat_FromDouble,
70 iPyUnicode_FromString,
71 iPyObject_SetAttrString,
72 iPyObject_IsInstance,
73 iPyErr_Fetch,
74 iPyObject_Str,
75 iPyFloat_Type,
76 iPyLong_Type,
77 iPyBool_Type,
78 iPyUnicode_Type,
79 iPyBool_FromLong,
80 iPyDict_New,
81 iPyDict_SetItemString,
82 iPyDict_GetItemString,
83 iPyGILState_Ensure,
84 iPyGILState_Release,
85 iPy_GetVersion,
86 numfunctions,
87 };
88
89 // eval 模式常量(匿名 enum,SWIG 兼容)
90 enum{
91 Py_eval_input = 258,
92 Py_file_input = 257,
93 Py_single_input = 256,
94 };
95 using funcarray = std::array<void*, numfunctions>;
96
98 static PythonAPI* Instance();
99
100 PythonAPI() = default;
101
102 explicit PythonAPI(bool shouldLoadDynamicLib);
103
104 ~PythonAPI();
105
107 errc_t load();
108
110 errc_t load(StringView path);
111
113 errc_t tryload(const std::vector<std::string>& libpaths);
114
116 errc_t unload();
117
119 bool isLoaded() const { return library_ != nullptr; }
120
121public: // -- 以下接口名称和签名与 Python C API 完全一致 --
122
123 void Py_Initialize();
124
125 int Py_FinalizeEx();
126
127 int Py_IsInitialized();
128
129 int PyRun_SimpleString(const char* command);
130
131 PyObject* PyImport_ImportModule(const char* name);
132
133 PyObject* PyObject_GetAttrString(PyObject* o, const char* attr_name);
134
135 PyObject* PyObject_CallObject(PyObject* callable, PyObject* args);
136
137 void Py_DecRef(PyObject* o);
138
139 void Py_IncRef(PyObject* o);
140
141 void PyErr_Print();
142
143 PyObject* PyErr_Occurred();
144
145 const char* PyUnicode_AsUTF8(PyObject* unicode);
146
147 // -- 以下为 PythonExecutor 所需的新增接口 --
148
149 PyObject* PyRun_String(const char* str, int start, PyObject* globals, PyObject* locals);
150
151 long PyLong_AsLong(PyObject* o);
152 double PyFloat_AsDouble(PyObject* o);
153
154 PyObject* PyLong_FromLong(long v);
155 PyObject* PyFloat_FromDouble(double v);
156 PyObject* PyUnicode_FromString(const char* u);
157 PyObject* PyBool_FromLong(long v);
158
159 PyObject* PyDict_New();
160 int PyDict_SetItemString(PyObject* dict, const char* key, PyObject* val);
161 PyObject* PyDict_GetItemString(PyObject* dict, const char* key);
162
163 int PyObject_SetAttrString(PyObject* o, const char* attr_name, PyObject* v);
164 int PyObject_IsInstance(PyObject* obj, PyObject* cls);
165
166 void PyErr_Fetch(PyObject** ptype, PyObject** pvalue, PyObject** ptraceback);
167 PyObject* PyObject_Str(PyObject* o);
168
169 // GIL 管理(多线程场景)
170 int PyGILState_Ensure();
171 void PyGILState_Release(int gstate);
172
174 const char* Py_GetVersion();
175
176 // 类型对象访问器(从 DLL 加载的数据符号)
177 PyObject* PyFloat_Type() const { return static_cast<PyObject*>(functions_[iPyFloat_Type]); }
178 PyObject* PyLong_Type() const { return static_cast<PyObject*>(functions_[iPyLong_Type]); }
179 PyObject* PyBool_Type() const { return static_cast<PyObject*>(functions_[iPyBool_Type]); }
180 PyObject* PyUnicode_Type() const { return static_cast<PyObject*>(functions_[iPyUnicode_Type]); }
181
182protected:
183 void checkerror();
184 A_DISABLE_COPY(PythonAPI);
185
186protected:
187 void* library_{nullptr};
188 funcarray functions_{};
189 std::mutex mutex_;
190};
191
194AST_NAMESPACE_END
195
196#endif // SWIG
Python API — 与 Python C API 接口一致的动态加载包装
定义 PythonAPI.hpp:49
bool isLoaded() const
检查是否已加载库
定义 PythonAPI.hpp:119