18 #if defined(PYPY_VERSION) 19 # error Embedding the interpreter is not supported with PyPy 22 #define PYBIND11_EMBEDDED_MODULE_IMPL(name) \ 23 extern "C" PyObject *pybind11_init_impl_##name(); \ 24 extern "C" PyObject *pybind11_init_impl_##name() { return pybind11_init_wrapper_##name(); } 41 #define PYBIND11_EMBEDDED_MODULE(name, variable) \ 42 static ::pybind11::module_::module_def PYBIND11_CONCAT(pybind11_module_def_, name); \ 43 static void PYBIND11_CONCAT(pybind11_init_, name)(::pybind11::module_ &); \ 44 static PyObject PYBIND11_CONCAT(*pybind11_init_wrapper_, name)() { \ 45 auto m = ::pybind11::module_::create_extension_module( \ 46 PYBIND11_TOSTRING(name), nullptr, &PYBIND11_CONCAT(pybind11_module_def_, name)); \ 48 PYBIND11_CONCAT(pybind11_init_, name)(m); \ 51 PYBIND11_CATCH_INIT_EXCEPTIONS \ 53 PYBIND11_EMBEDDED_MODULE_IMPL(name) \ 54 ::pybind11::detail::embedded_module PYBIND11_CONCAT(pybind11_module_, name)( \ 55 PYBIND11_TOSTRING(name), PYBIND11_CONCAT(pybind11_init_impl_, name)); \ 56 void PYBIND11_CONCAT(pybind11_init_, name)(::pybind11::module_ \ 57 & variable) // NOLINT(bugprone-macro-parentheses) 66 if (Py_IsInitialized() != 0) {
67 pybind11_fail(
"Can't add new modules after the interpreter has been initialized");
70 auto result = PyImport_AppendInittab(name, init);
85 wchar_t *widened_arg = Py_DecodeLocale(safe_arg,
nullptr);
112 const
char *const *argv =
nullptr,
113 bool add_program_dir_to_path = true) {
114 if (Py_IsInitialized() != 0) {
118 #if PY_VERSION_HEX < 0x030B0000 120 Py_InitializeEx(init_signal_handlers ? 1 : 0);
124 bool special_case = (argv ==
nullptr || argc <= 0);
126 const char *
const empty_argv[]{
"\0"};
127 const char *
const *safe_argv = special_case ? empty_argv : argv;
132 auto argv_size =
static_cast<size_t>(argc);
134 std::unique_ptr<wchar_t *[]> widened_argv(
new wchar_t *[argv_size]);
135 std::vector<std::unique_ptr<wchar_t[], detail::wide_char_arg_deleter>> widened_argv_entries;
136 widened_argv_entries.reserve(argv_size);
137 for (
size_t ii = 0; ii < argv_size; ++ii) {
139 if (!widened_argv_entries.back()) {
144 widened_argv[ii] = widened_argv_entries.back().get();
147 auto *pysys_argv = widened_argv.get();
149 PySys_SetArgvEx(argc, pysys_argv, static_cast<int>(add_program_dir_to_path));
152 PyConfig_InitIsolatedConfig(&config);
153 config.install_signal_handlers = init_signal_handlers ? 1 : 0;
155 PyStatus status = PyConfig_SetBytesArgv(&config, argc, const_cast<char *const *>(argv));
156 if (PyStatus_Exception(status)) {
159 PyConfig_Clear(&config);
160 throw std::runtime_error(PyStatus_IsError(status) ? status.err_msg
161 :
"Failed to prepare CPython");
163 status = Py_InitializeFromConfig(&config);
164 PyConfig_Clear(&config);
165 if (PyStatus_Exception(status)) {
166 throw std::runtime_error(PyStatus_IsError(status) ? status.err_msg
167 :
"Failed to init CPython");
169 if (add_program_dir_to_path) {
170 PyRun_SimpleString(
"import sys, os.path; " 171 "sys.path.insert(0, " 172 "os.path.abspath(os.path.dirname(sys.argv[0])) " 173 "if sys.argv and os.path.exists(sys.argv[0]) else '')");
214 handle builtins(PyEval_GetBuiltins());
222 if (builtins.contains(
id) && isinstance<capsule>(builtins[
id])) {
223 internals_ptr_ptr =
capsule(builtins[
id]);
232 if (internals_ptr_ptr) {
233 delete *internals_ptr_ptr;
234 *internals_ptr_ptr =
nullptr;
257 const char *
const *argv =
nullptr,
258 bool add_program_dir_to_path =
true) {
274 bool is_valid =
true;
void initialize_interpreter(bool init_signal_handlers=true, int argc=0, const char *const *argv=nullptr, bool add_program_dir_to_path=true)
embedded_module(const char *name, init_t init)
scoped_interpreter(bool init_signal_handlers=true, int argc=0, const char *const *argv=nullptr, bool add_program_dir_to_path=true)
void finalize_interpreter()
wchar_t * widen_chars(const char *safe_arg)
std::forward_list< ExceptionTranslator > registered_exception_translators
scoped_interpreter(scoped_interpreter &&other) noexcept
#define PYBIND11_NAMESPACE
static const Similarity3 id
PyExc_RuntimeError [[noreturn]] PYBIND11_NOINLINE void pybind11_fail(const char *reason)
Used internally.
Python 2.7/3.x compatible version of PyImport_AppendInittab and error checks.
local_internals & get_local_internals()
Works like get_internals, but for things which are locally registered.
type_map< type_info * > registered_types_cpp
#define PYBIND11_INTERNALS_ID
Annotation for function names.
void operator()(wchar_t *ptr) const
internals **& get_internals_pp()
#define PYBIND11_NAMESPACE_END(name)
#define PYBIND11_NAMESPACE_BEGIN(name)