Skip to content

import ROOT fails after a template instantiation is invoked from cppyy #18441

@pikacic

Description

@pikacic

Check duplicate issues.

  • Checked for duplicates

Description

We used to trigger instantiations of templates in Python using cppyy wrapper classes as template arguments, but this broke when we moved to ROOT 6.32 (it's still broken in 6.34).

This is what we get:

python
Python 3.11.9 (main, Jun 18 2024, 17:35:16) [GCC 13.1.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import cppyy
>>> cppyy.include("vector")
True
>>> cppyy.cppdef("struct MyData {};")
True
>>> my_vec = cppyy.gbl.std.vector[cppyy.gbl.MyData]
>>> import ROOT
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.32.10-73580/x86_64-el9-gcc13-opt/lib/ROOT/__init__.py", line 39, in <module>
    _register_pythonizations()
  File "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.32.10-73580/x86_64-el9-gcc13-opt/lib/ROOT/_pythonization/__init__.py", line 302, in _register_pythonizations
    importlib.import_module(__name__ + '.' + module_name)
  File "/cvmfs/lhcb.cern.ch/lib/lcg/releases/Python/3.11.9-2924c/x86_64-el9-gcc13-opt/lib/python3.11/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.32.10-73580/x86_64-el9-gcc13-opt/lib/ROOT/_pythonization/_runtime_error.py", line 34, in <module>
    @pythonization("runtime_error", ns="std")
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.32.10-73580/x86_64-el9-gcc13-opt/lib/ROOT/_pythonization/__init__.py", line 99, in pythonization_impl
    _find_used_classes(ns, passes_filter, user_pythonizor, npars)
  File "/cvmfs/lhcb.cern.ch/lib/lcg/releases/ROOT/6.32.10-73580/x86_64-el9-gcc13-opt/lib/ROOT/_pythonization/__init__.py", line 264, in _find_used_classes
    instance_name = var_name + "<" + ",".join(args) + ">"
                                     ^^^^^^^^^^^^^^
TypeError: sequence item 0: expected str instance, MyData_meta found
>>>

If I replace cppyy.gbl.std.vector[cppyy.gbl.MyData] with cppyy.gbl.std.vector["MyData"] the problem disappears.

Reproducer

I used the EP-SFT builds of ROOT via something like source /cvmfs/sft.cern.ch/lcg/views/LCG_107a/x86_64-el9-gcc13-opt/setup.sh, then i run this little bit of Python:

import cppyy
cppyy.include("vector")
cppyy.cppdef("struct MyData {};")
my_vec = cppyy.gbl.std.vector[cppyy.gbl.MyData]
import ROOT

ROOT version

ROOT v6.34.04
Built for linuxx8664gcc on Feb 11 2025, 14:05:34
From tags/6-34-04@6-34-04
With g++ (GCC) 13.1.0
Binary directory: /cvmfs/sft.cern.ch/lcg/releases/ROOT/6.34.04-2bf94/x86_64-el9-gcc13-opt/bin

Installation method

EP-SFT managed installations

Operating system

Linux RHEL9

Additional context

No response

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions