18#if defined(PYPY_VERSION) 
   19#    error Embedding the interpreter is not supported with PyPy 
   22#if PY_MAJOR_VERSION >= 3 
   23#    define PYBIND11_EMBEDDED_MODULE_IMPL(name)                                                   \ 
   24        extern "C" PyObject *pybind11_init_impl_##name();                                         \
 
   25        extern "C" PyObject *pybind11_init_impl_##name() { return pybind11_init_wrapper_##name(); }
 
   27#    define PYBIND11_EMBEDDED_MODULE_IMPL(name)                                                   \ 
   28        extern "C" void pybind11_init_impl_##name();                                              \
 
   29        extern "C" void pybind11_init_impl_##name() { pybind11_init_wrapper_##name(); }
 
   47#define PYBIND11_EMBEDDED_MODULE(name, variable)                                                  \ 
   48    static ::pybind11::module_::module_def PYBIND11_CONCAT(pybind11_module_def_, name);           \ 
   49    static void PYBIND11_CONCAT(pybind11_init_, name)(::pybind11::module_ &);                     \ 
   50    static PyObject PYBIND11_CONCAT(*pybind11_init_wrapper_, name)() {                            \ 
   51        auto m = ::pybind11::module_::create_extension_module(                                    \ 
   52            PYBIND11_TOSTRING(name), nullptr, &PYBIND11_CONCAT(pybind11_module_def_, name));      \ 
   54            PYBIND11_CONCAT(pybind11_init_, name)(m);                                             \ 
   57        PYBIND11_CATCH_INIT_EXCEPTIONS                                                            \ 
   59    PYBIND11_EMBEDDED_MODULE_IMPL(name)                                                           \ 
   60    ::pybind11::detail::embedded_module PYBIND11_CONCAT(pybind11_module_, name)(                  \ 
   61        PYBIND11_TOSTRING(name), PYBIND11_CONCAT(pybind11_init_impl_, name));                     \ 
   62    void PYBIND11_CONCAT(pybind11_init_, name)(::pybind11::module_                                \ 
   70#if PY_MAJOR_VERSION >= 3 
   71    using init_t = PyObject *(*) ();
 
   76        if (Py_IsInitialized() != 0) {
 
   77            pybind11_fail(
"Can't add new modules after the interpreter has been initialized");
 
   80        auto result = PyImport_AppendInittab(
name, 
init);
 
   89#if PY_VERSION_HEX >= 0x030500f0 
   99#if PY_VERSION_HEX >= 0x030500f0 
  100    wchar_t *widened_arg = Py_DecodeLocale(safe_arg, 
nullptr);
 
  102    wchar_t *widened_arg = 
nullptr;
 
  105#    if defined(_MSC_VER) 
  106#        pragma warning(push) 
  107#        pragma warning(disable : 4996) 
  110#    if defined(HAVE_BROKEN_MBSTOWCS) && HAVE_BROKEN_MBSTOWCS 
  111    size_t count = std::strlen(safe_arg);
 
  113    size_t count = std::mbstowcs(
nullptr, safe_arg, 0);
 
  115    if (count != 
static_cast<size_t>(-1)) {
 
  116        widened_arg = 
new wchar_t[count + 1];
 
  117        std::mbstowcs(widened_arg, safe_arg, count + 1);
 
  120#    if defined(_MSC_VER) 
  132    bool special_case = (argv == 
nullptr || argc <= 0);
 
  134    const char *
const empty_argv[]{
"\0"};
 
  135    const char *
const *safe_argv = special_case ? empty_argv : argv;
 
  140    auto argv_size = 
static_cast<size_t>(argc);
 
  141#if PY_MAJOR_VERSION >= 3 
  143    std::unique_ptr<wchar_t *[]> widened_argv(
new wchar_t *[argv_size]);
 
  144    std::vector<std::unique_ptr<wchar_t[], wide_char_arg_deleter>> widened_argv_entries;
 
  145    widened_argv_entries.reserve(argv_size);
 
  146    for (
size_t ii = 0; ii < argv_size; ++ii) {
 
  147        widened_argv_entries.emplace_back(
widen_chars(safe_argv[ii]));
 
  148        if (!widened_argv_entries.back()) {
 
  153        widened_argv[ii] = widened_argv_entries.back().get();
 
  156    auto *pysys_argv = widened_argv.get();
 
  159    std::vector<std::string> strings{safe_argv, safe_argv + argv_size};
 
  160    std::vector<char *> char_strings{argv_size};
 
  161    for (std::size_t i = 0; i < argv_size; ++i)
 
  162        char_strings[i] = &strings[i][0];
 
  163    char **pysys_argv = char_strings.data();
 
  166    PySys_SetArgvEx(argc, pysys_argv, 
static_cast<int>(add_program_dir_to_path));
 
  192                                   const 
char *const *argv = 
nullptr,
 
  193                                   bool add_program_dir_to_path = true) {
 
  194    if (Py_IsInitialized() != 0) {
 
  198    Py_InitializeEx(init_signal_handlers ? 1 : 0);
 
  200    detail::set_interpreter_argv(argc, argv, add_program_dir_to_path);
 
  239    handle builtins(PyEval_GetBuiltins());
 
  245    detail::internals **internals_ptr_ptr = detail::get_internals_pp();
 
  247    if (builtins.contains(
id) && isinstance<capsule>(builtins[
id])) {
 
  248        internals_ptr_ptr = 
capsule(builtins[
id]);
 
  252    detail::get_local_internals().registered_types_cpp.clear();
 
  253    detail::get_local_internals().registered_exception_translators.clear();
 
  257    if (internals_ptr_ptr) {
 
  258        delete *internals_ptr_ptr;
 
  259        *internals_ptr_ptr = 
nullptr;
 
  282                                const char *
const *argv = 
nullptr,
 
  283                                bool add_program_dir_to_path = 
true) {
 
\rst Holds a reference to a Python object (no reference counting)
 
\rst Scope guard version of initialize_interpreter and finalize_interpreter.
 
scoped_interpreter & operator=(const scoped_interpreter &)=delete
 
scoped_interpreter(const scoped_interpreter &)=delete
 
scoped_interpreter & operator=(scoped_interpreter &&)=delete
 
scoped_interpreter(bool init_signal_handlers=true, int argc=0, const char *const *argv=nullptr, bool add_program_dir_to_path=true)
 
scoped_interpreter(scoped_interpreter &&other) noexcept
 
PYBIND11_NOINLINE void pybind11_fail(const char *reason)
Thrown when pybind11::cast or.
 
#define PYBIND11_NAMESPACE_END(name)
 
#define PYBIND11_NAMESPACE_BEGIN(name)
 
#define PYBIND11_INTERNALS_ID
 
wchar_t * widen_chars(const char *safe_arg)
 
void finalize_interpreter()
\rst Shut down the Python interpreter.
 
void initialize_interpreter(bool init_signal_handlers=true, int argc=0, const char *const *argv=nullptr, bool add_program_dir_to_path=true)
\rst Initialize the Python interpreter.
 
void set_interpreter_argv(int argc, const char *const *argv, bool add_program_dir_to_path)
Python 2.x/3.x-compatible version of PySys_SetArgv
 
detail::initimpl::constructor< Args... > init()
Binds an existing constructor taking arguments Args...
 
void finalize_interpreter()
\rst Shut down the Python interpreter.
 
void initialize_interpreter(PyConfig *config, int argc=0, const char *const *argv=nullptr, bool add_program_dir_to_path=true)
 
Python 2.7/3.x compatible version of PyImport_AppendInittab and error checks.
 
embedded_module(const char *name, init_t init)
 
Annotation for function names.
 
void operator()(wchar_t *ptr) const