🛰️航天仿真算法库 SpaceAST 0.0.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 numfunctions,
86 };
87
88 // eval 模式常量(匿名 enum,SWIG 兼容)
89 enum{
90 Py_eval_input = 258,
91 Py_file_input = 257,
92 Py_single_input = 256,
93 };
94 using funcarray = std::array<void*, numfunctions>;
95
97 static PythonAPI* Instance();
98
99 PythonAPI() = default;
100
101 explicit PythonAPI(bool shouldLoadDynamicLib);
102
103 ~PythonAPI();
104
106 errc_t load(StringView libpath);
107
109 errc_t tryload(const std::vector<std::string>& libpaths);
110
112 errc_t unload();
113
115 bool isLoaded() const { return library_ != nullptr; }
116
117public: // -- 以下接口名称和签名与 Python C API 完全一致 --
118
119 void Py_Initialize();
120
121 int Py_FinalizeEx();
122
123 int Py_IsInitialized();
124
125 int PyRun_SimpleString(const char* command);
126
127 PyObject* PyImport_ImportModule(const char* name);
128
129 PyObject* PyObject_GetAttrString(PyObject* o, const char* attr_name);
130
131 PyObject* PyObject_CallObject(PyObject* callable, PyObject* args);
132
133 void Py_DecRef(PyObject* o);
134
135 void Py_IncRef(PyObject* o);
136
137 void PyErr_Print();
138
139 PyObject* PyErr_Occurred();
140
141 const char* PyUnicode_AsUTF8(PyObject* unicode);
142
143 // -- 以下为 PythonExecutor 所需的新增接口 --
144
145 PyObject* PyRun_String(const char* str, int start, PyObject* globals, PyObject* locals);
146
147 long PyLong_AsLong(PyObject* o);
148 double PyFloat_AsDouble(PyObject* o);
149
150 PyObject* PyLong_FromLong(long v);
151 PyObject* PyFloat_FromDouble(double v);
152 PyObject* PyUnicode_FromString(const char* u);
153 PyObject* PyBool_FromLong(long v);
154
155 PyObject* PyDict_New();
156 int PyDict_SetItemString(PyObject* dict, const char* key, PyObject* val);
157 PyObject* PyDict_GetItemString(PyObject* dict, const char* key);
158
159 int PyObject_SetAttrString(PyObject* o, const char* attr_name, PyObject* v);
160 int PyObject_IsInstance(PyObject* obj, PyObject* cls);
161
162 void PyErr_Fetch(PyObject** ptype, PyObject** pvalue, PyObject** ptraceback);
163 PyObject* PyObject_Str(PyObject* o);
164
165 // GIL 管理(多线程场景)
166 int PyGILState_Ensure();
167 void PyGILState_Release(int gstate);
168
169 // 类型对象访问器(从 DLL 加载的数据符号)
170 PyObject* PyFloat_Type() const { return static_cast<PyObject*>(functions_[iPyFloat_Type]); }
171 PyObject* PyLong_Type() const { return static_cast<PyObject*>(functions_[iPyLong_Type]); }
172 PyObject* PyBool_Type() const { return static_cast<PyObject*>(functions_[iPyBool_Type]); }
173 PyObject* PyUnicode_Type() const { return static_cast<PyObject*>(functions_[iPyUnicode_Type]); }
174
175protected:
176 void checkerror();
177 A_DISABLE_COPY(PythonAPI);
178
179protected:
180 void* library_{nullptr};
181 funcarray functions_{};
182 std::mutex mutex_;
183};
184
187AST_NAMESPACE_END
188
189#endif // SWIG
Python API — 与 Python C API 接口一致的动态加载包装
定义 PythonAPI.hpp:49
bool isLoaded() const
检查是否已加载库
定义 PythonAPI.hpp:115