module

PyCall

Обёртки над libpython (аналог LibPython::Helpers + LibPython::API в гемме).

Constants

MUTEX = Mutex.new

Глобальная блокировка на ВЕСЬ доступ к Python из Crystal.

CPython GIL (PyGILState_Ensure/Release) защищает отдельные C-вызовы, но составные операции (getattr → call → convert, обход dict и т.п.) без неё могли чередоваться между фиберами на разных тредах. Этот мьютекс сериализует операции целиком — один глобальный замок на весь шард, как require GVL в MRI.

Вложенные вызовы PyCall.gil на том же треде идут по быстрому пути: если тред уже держит GIL (внешний захват или трамплин колбэка), повторный захват мьютекса не выполняется — иначе нереентерабельный Mutex дал бы дедлок. Порядок проверок критичен: колбэк из Python (трамплин) держит GIL, НЕ держит мьютекс — и не должен его брать, пока другой тред ждёт GIL под мьютексом.

VERSION = "0.1.0"

Class methods

builtins
Source
callable(proc : Proc(Array(PyValue), PyValue), name : String = "pycall_callback") : Callable

Обёртка Proc → python callable (см. PyCall::Callable).

Source
callable?(obj : PyValue) : Bool

Примитивы (конвертированные из Python) не-callable по определению.

Source
delattr(obj : PyWrap, name : String) : Nil
Source
dir(obj : PyWrap) : Object
Source
ensure_init!
Source
eval(expr : String, globals : PyWrap | Nil = nil, locals : PyWrap | Nil = nil) : Object
Source
exec(code : String, globals : PyWrap | Nil = nil, locals : PyWrap | Nil = nil) : Nil
Source
getattr(obj : PyWrap, name : String) : Object
Source
gil

Взять GIL на блок (PyGILState_Ensure/Release) под глобальным мьютексом. Реентерабелен на том же треде (см. комментарий у MUTEX).

Source
hasattr?(obj : PyWrap, name : String) : Bool
Source
import_module(name : String | Symbol) : PyWrap
Source
init!

Инициализация интерпретатора — PyCall.init в гемме. Идемпотентна; вызывается автоматически при первом обращении к API.

Source
initialized?
Source
iterable(obj : PyWrap) : IterableWrapper
Source
len(obj : PyWrap) : Int64
Source
python_description
Source
python_version

"3.13.7 (v3.13.7:...) [GCC ...]" → "3.13.7"

Source
same?(left : PyWrap, right : PyWrap) : Bool
Source
setattr(obj : PyWrap, name : String, value) : Object
Source
truthy?(obj : Object) : Bool
Source
tuple(iterable = nil) : Tuple

iterable может быть PyWrap или Crystal-значением (Array и т.п. — конвертация через Conversion.from_crystal).

Source
with(ctx : PyWrap, &)

Менеджер контекста: PyCall.with(open(...)) { |f| ... }

Source

Nested types