Browse Source

fix: set __file__ on submodules (#5584)

* fix: set __file__ on submodules

The docs state ['The caller is responsible for setting a `__file__` attribute'](https://docs.python.org/3/c-api/module.html), but we
were not doing that, which interferes with pickling objects in submodules using cloudpickle. Users previously had to set the `__file__` attributes manually,
such as in 1fbbe1632e/src/boost_histogram/histogram.py (L83-L90).

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

* fix: support GraalPy

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

* fix: workaround only for GraalPython

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>

* Add GRAALPY_VERSION_NUM to GraalPy workaround

* Fix "GRAALPY_VERSION_NUM not defined" issue

```
/Users/runner/work/pybind11/pybind11/include/pybind11/pybind11.h:1340:32: error: 'GRAALPY_VERSION_NUM' is not defined, evaluates to 0 [-Werror,-Wundef]
                               ^
```

Related ChatGPT conversation: https://chatgpt.com/share/67e6cb99-84b0-8008-99d6-aadc70242cf3

---------

Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com>
Co-authored-by: Ralf W. Grosse-Kunstleve <rgrossekunst@nvidia.com>
pull/5587/head
Henry Schreiner 3 months ago committed by GitHub
parent
commit
8f00d1eea0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 13
      include/pybind11/pybind11.h
  2. 1
      tests/test_modules.py

13
include/pybind11/pybind11.h

@ -1336,6 +1336,19 @@ public: @@ -1336,6 +1336,19 @@ public:
if (doc && options::show_user_defined_docstrings()) {
result.attr("__doc__") = pybind11::str(doc);
}
#if defined(GRAALVM_PYTHON) && (!defined(GRAALPY_VERSION_NUM) || GRAALPY_VERSION_NUM < 0x190000)
// GraalPy doesn't support PyModule_GetFilenameObject,
// so getting by attribute (see PR #5584)
handle this_module = m_ptr;
result.attr("__file__") = this_module.attr("__file__");
#else
handle this_file = PyModule_GetFilenameObject(m_ptr);
if (!this_file) {
throw error_already_set();
}
result.attr("__file__") = this_file;
#endif
attr(name) = result;
return result;
}

1
tests/test_modules.py

@ -21,6 +21,7 @@ def test_nested_modules(): @@ -21,6 +21,7 @@ def test_nested_modules():
)
assert m.__name__ == "pybind11_tests.modules"
assert ms.__name__ == "pybind11_tests.modules.subsubmodule"
assert m.__file__ == ms.__file__
assert ms.submodule_func() == "submodule_func()"

Loading…
Cancel
Save