You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
When creating a module using the constructor directly instead of using a macro from pybind11, and when defining multiple functions in it using py::exec, there seem to be an issue. I'm not sure yet if the issue comes from py::exec, but the following code works fine when py::exec is replaced by py::module::import("builtins").attr("exec").
Reproducible example code
py::module my_module("my_module");
std::string my_code = "\n""def foo():\n"" return 4\n""\n""def bar():\n"" return foo()\n";
py::exec(my_code, py::globals(), my_module.attr("__dict__"));
py::print(my_module.attr("foo")()); // Prints "4" as expectedpy::print(my_module.attr("bar")()); // Oops, "NameError: global name 'foo' is not defined"
The text was updated successfully, but these errors were encountered:
martinRenou
changed the title
Defining multiple functions in a module created with py::module constructor
missing __builtins__ in the scope with py::exec
Jan 7, 2019
The problem is that it won't be possible to use builtins functions, or even the import keyword. Because the __builtins__ key is not in the my_module.attr("__dict__") dictionary. Which means that this part of the documentation is not implemented in py::exec:
If the globals dictionary does not contain a value for the key builtins, a reference to the dictionary of the built-in module builtins is inserted under that key.
Issue description
When creating a module using the constructor directly instead of using a macro from
pybind11
, and when defining multiple functions in it usingpy::exec
, there seem to be an issue. I'm not sure yet if the issue comes frompy::exec
, but the following code works fine whenpy::exec
is replaced bypy::module::import("builtins").attr("exec")
.Reproducible example code
The text was updated successfully, but these errors were encountered: