Skip to content

Conversation

@atc93
Copy link

@atc93 atc93 commented Dec 10, 2025

PR note: Python 3.13 import fix for srwlpy

What changed

  • File: cpp/src/clients/python/srwlpy.cpp
  • Function: ParseDeviceParam
  • Replaced the _PyLong_AsInt / PyLong_AsInt block with a public API call: cpp long devIdx = PyLong_AsLong(oDev); if((devIdx == -1) && PyErr_Occurred()) { delete[] parGPUParam; parGPUParam = 0; return; } parGPUParam[1] = (double)devIdx;

Why

  • Python 3.13 removed the private symbol _PyLong_AsInt, causing srwlpy.so to fail at import with undefined symbol: _PyLong_AsInt.
  • PyLong_AsInt is not reliably exported in 3.13 builds either; the stable, public API is PyLong_AsLong (or PyLong_AsLongAndOverflow).
  • Switching to PyLong_AsLong restores compatibility with Python 3.13 and keeps behavior identical for device index parsing.

Impact

  • Fixes import/runtime failure on Python 3.13.
  • No behavior change for earlier Python versions; still converts the device index to a double and assigns it to parGPUParam[1].

Notes

  • If a strict 32-bit range check is desired, PyLong_AsLongAndOverflow could be used instead; current behavior matches prior code semantics.
  • Python 3 unified ints as "long"; the Python/C API docs recommend using PyLong_* for all integer conversions in Python 3 (see https://docs.python.org/3/c-api/long.html).

# PR note: Python 3.13 import fix for `srwlpy`

## What changed
- File: `cpp/src/clients/python/srwlpy.cpp`
- Function: `ParseDeviceParam`
- Replaced the `_PyLong_AsInt` / `PyLong_AsInt` block with a public API call:
  ```cpp
  long devIdx = PyLong_AsLong(oDev);
  if((devIdx == -1) && PyErr_Occurred()) {
      delete[] parGPUParam;
      parGPUParam = 0;
      return;
  }
  parGPUParam[1] = (double)devIdx;
  ```

## Why
- Python 3.13 removed the private symbol `_PyLong_AsInt`, causing `srwlpy.so` to fail at import with `undefined symbol: _PyLong_AsInt`.
- `PyLong_AsInt` is not reliably exported in 3.13 builds either; the stable, public API is `PyLong_AsLong` (or `PyLong_AsLongAndOverflow`).
- Switching to `PyLong_AsLong` restores compatibility with Python 3.13 and keeps behavior identical for device index parsing.

## Impact
- Fixes import/runtime failure on Python 3.13.
- No behavior change for earlier Python versions; still converts the device index to a double and assigns it to `parGPUParam[1]`.

## Notes
- If a strict 32-bit range check is desired, `PyLong_AsLongAndOverflow` could be used instead; current behavior matches prior code semantics.
- Python 3 unified ints as "long"; the Python/C API docs recommend using `PyLong_*` for all integer conversions in Python 3 (see https://docs.python.org/3/c-api/long.html).
@atc93
Copy link
Author

atc93 commented Dec 10, 2025

On further checks, PyLong_AsInt seems to be working no problem and supported. My findings were plagued with a mistake I made.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant