Skip to content

Error accessing attribute of Python object from Julia. #598

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Open
J-C-Q opened this issue Mar 27, 2025 · 1 comment
Open

Error accessing attribute of Python object from Julia. #598

J-C-Q opened this issue Mar 27, 2025 · 1 comment
Labels
bug Something isn't working

Comments

@J-C-Q
Copy link

J-C-Q commented Mar 27, 2025

Affects: PythonCall

Describe the bug
Im trying to use qiskit_aer, which is a python package, from Julia.
First I add the dependencies, which results in my CondaPkg.toml to look like this:

[deps]
qiskit-aer = "0.16.1.*"
qiskit = "1.4.2.*"

Then I load it:

const qiskit_aer = PythonCall.pynew()
PythonCall.pycopy!(qiskit_aer, PythonCall.pyimport("qiskit_aer"))

Now I can create an simulator object:

test = qiskit_aer.AerSimulator(
               method="statevector",
               device="CPU",
               enable_truncation=false,
               target=[0]
           )

And I can see all its attributes when pressing tab for auto compleation:

julia> test.
_AVAILABLE_DEVICES         _AVAILABLE_METHODS         _BASIS_GATES               _CUSTOM_INSTR              _DEFAULT_CONFIGURATION     _SIMULATION_DEVICES        _SIMULATION_METHODS
__abstractmethods__        __class__                  __delattr__                __dict__                   __dir__                    __doc__                    __eq__
__format__                 __ge__                     __getattribute__           __getstate__               __gt__                     __hash__                   __init__
__init_subclass__          __le__                     __lt__                     __module__                 __ne__                     __new__                    __reduce__
__reduce_ex__              __repr__                   __setattr__                __sizeof__                 __slots__                  __str__                    __subclasshook__
__weakref__                _abc_impl                  _assemble_noise_model      _basis_gates               _cached_basis_gates        _check_basis_gates         _compile
_configuration             _controller                _convert_binds             _convert_circuit_binds     _coupling_map              _default_options           _execute_circuits
_execute_circuits_job      _format_results            _from_backend              _get_executor              _instruction_schedule_map  _mapping                   _options
_options_configuration     _options_properties        _properties                _provider                  _run_circuits              _set_configuration_option  _set_method_config
_set_properties_option     _target                    acquire_channel            available_devices          available_methods          backend_version            clear_options
configuration              control_channel            coupling_map               description                drive_channel              dt                         dtm
from_backend               instruction_durations      instruction_schedule_map   instructions               max_circuits               meas_map                   measure_channel
name                       num_qubits                 online_date                operation_names            operations                 options                    properties
provider                   qubit_properties           run                        set_max_qubits             set_option                 set_options                status
target

So far it works great. Now the bug occurs when I actually want to get one of these attributes:

julia> test.num_qubits
ERROR: Python: AttributeError: Julia: type Array has no field num_qubits
Python stacktrace:
 [1] __getattr__
   @ ~/.julia/packages/PythonCall/WMWY0/src/JlWrap/any.jl:249
 [2] num_qubits
   @ qiskit.providers.backend /files/home/part8/user/Bookworm/Documents/project/.CondaPkg/env/lib/python3.11/site-packages/qiskit/providers/backend.py:406
Stacktrace:
 [1] pythrow()
   @ PythonCall.Core ~/.julia/packages/PythonCall/WMWY0/src/Core/err.jl:92
 [2] errcheck
   @ ~/.julia/packages/PythonCall/WMWY0/src/Core/err.jl:10 [inlined]
 [3] pygetattr(x::Py, k::String)
   @ PythonCall.Core ~/.julia/packages/PythonCall/WMWY0/src/Core/builtins.jl:62
 [4] getproperty(x::Py, k::Symbol)
   @ PythonCall.Core ~/.julia/packages/PythonCall/WMWY0/src/Core/Py.jl:273
 [5] top-level scope
   @ REPL[19]:1

I would expect this to just return a number. The attribute existes, see docs.

Your system

julia> versioninfo()
Julia Version 1.11.4
Commit 8561cc3d68d (2025-03-10 11:36 UTC)
Build Info:
  Official https://julialang.org/ release
Platform Info:
  OS: Linux (x86_64-linux-gnu)
  CPU: 24 × 13th Gen Intel(R) Core(TM) i7-13700
  WORD_SIZE: 64
  LLVM: libLLVM-16.0.6 (ORCJIT, alderlake)
Threads: 1 default, 0 interactive, 1 GC (on 24 virtual cores)
Environment:
  JULIA_EDITOR = code
julia> CondaPkg.status()
CondaPkg Status /files/home/part8/user/Bookworm/Documents/project/CondaPkg.toml
Environment
  /files/home/part8/user/Bookworm/Documents/project/.CondaPkg/env
Packages
  qiskit v1.4.2 (1.4.2.*)
  qiskit-aer v0.16.1 (0.16.1.*)
@J-C-Q J-C-Q added the bug Something isn't working label Mar 27, 2025
@cjdoris
Copy link
Collaborator

cjdoris commented Apr 12, 2025

The erroring function in qiskit is

    @property
    def num_qubits(self) -> int:
        """Return the number of qubits the backend has."""
        return self.target.num_qubits

Now self.target is presumably [0], which is converted from Julia to Python as a juliacall.AnyValue which doesn't have the num_qubits attribute.

My guess is that the qiskit package doesn't like juliacall.AnyValue and would rather have a list (target=pylist([0])) or numpy array (target=numpy.array([0])).

# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

2 participants