Open
Conversation
# 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).
Author
|
On further checks, PyLong_AsInt seems to be working no problem and supported. My findings were plagued with a mistake I made. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
PR note: Python 3.13 import fix for
srwlpyWhat changed
cpp/src/clients/python/srwlpy.cppParseDeviceParam_PyLong_AsInt/PyLong_AsIntblock 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
_PyLong_AsInt, causingsrwlpy.soto fail at import withundefined symbol: _PyLong_AsInt.PyLong_AsIntis not reliably exported in 3.13 builds either; the stable, public API isPyLong_AsLong(orPyLong_AsLongAndOverflow).PyLong_AsLongrestores compatibility with Python 3.13 and keeps behavior identical for device index parsing.Impact
parGPUParam[1].Notes
PyLong_AsLongAndOverflowcould be used instead; current behavior matches prior code semantics.PyLong_*for all integer conversions in Python 3 (see https://docs.python.org/3/c-api/long.html).