JuliaPy / JuliaPy/PythonCall.jl

Segmentation fault when registering Julia-defined Python class with Matplotlib

Đang mở
#289 1 bình luận 0 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
Julia
Star
1.1k
Fork
86
Merge trung bình
1 ngày 22 giờ
Pull request đã merge (30 ngày)
3

Mô tả

I have implemented a custom axis transform [according to the documentation](https://matplotlib.org/stable/api/transformations.html):

```julia
SqrtTransform = pytype("SqrtTransform", (matplotlib.transforms.Transform,), [
"__module__" => "__main__",
pyfunc(name="__init__",
function (self)
self.input_dims = 1
self.output_dims = 1
self.is_separable = true
self.has_inverse = true
matplotlib.transforms.Transform.__init__(self)
end),
pyfunc(name="transform_non_affine",
function(self, a)
b = pyconvert(Array, a)
v = similar(b)
sel = b .>= 0
v[sel] .= .√(b[sel])
# v[.!sel] .= NaN
v
end),
pyfunc(name="inverted",
(self) -> SquareTransform())
])

SquareTransform = pytype("SquareTransform", (matplotlib.transforms.Transform,), [
"__module__" => "__main__",
pyfunc(name="__init__",
function (self)
self.input_dims = 1
self.output_dims = 1
self.is_separable = true
self.has_inverse = true
matplotlib.transforms.Transform.__init__(self)
end),
pyfunc(name="transform_non_affine",
function(self, a)
pyconvert(Array, a) .^ 2
end),
pyfunc(name="inverted",
(self) -> SqrtTransform())
])

SqrtScale = pytype("SqrtScale", (matplotlib.scale.ScaleBase,), [
"__module__" => "__main__",
"name" => "sqrt",
pyfunc(name="__init__",
function(self, axis, args...; kwargs...)
matplotlib.scale.ScaleBase.__init__(self, axis)
end),
pyfunc(name="get_transform",
(self) -> SqrtTransform()),
pyfunc(name="set_default_locators_and_formatters",
(self, axis) -> nothing),
pyfunc(name="limit_range_for_scale",
function(self, vmin, vmax, minpos)
max(vmin, 0), max(vmax, 0)
end)])
```

To register this with Matplotlib, one uses
```julia
matplotlib.scale.register_scale(SqrtScale)
```

This works well from a script, but not if I try to put it into a package. If I just put the line registering the transform with Matplotlib after the class definitions, nothing happens, i.e. Matplotlib does not in fact register the new transform. If I instead try to register it from `__init__()`, or from the REPL after having loaded the package, it crashes with the following trace:

```julia
signal (11): Segmentation fault: 11
in expression starting at REPL[4]:1
_PyFunction_Vectorcall at /Users/jagot/work/projects/move-to-pythoncall/.CondaPkg/env/lib/libpython3.11.dylib (unknown line)
PyObject_CallObject at /Users/jagot/.julia/packages/PythonCall/dsECZ/src/cpython/pointers.jl:299 [inlined]
pycallargs at /Users/jagot/.julia/packages/PythonCall/dsECZ/src/abstract/object.jl:210
unknown function (ip: 0x10ce5a8e6)
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
#pycall#59 at /Users/jagot/.julia/packages/PythonCall/dsECZ/src/abstract/object.jl:228
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
do_apply at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
pycall at /Users/jagot/.julia/packages/PythonCall/dsECZ/src/abstract/object.jl:218
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
do_apply at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
#_#11 at /Users/jagot/.julia/packages/PythonCall/dsECZ/src/Py.jl:352
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
do_apply at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
Py at /Users/jagot/.julia/packages/PythonCall/dsECZ/src/Py.jl:352
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
do_call at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
eval_body at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
jl_interpret_toplevel_thunk at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
jl_toplevel_eval_flex at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
jl_toplevel_eval_flex at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
jl_toplevel_eval_flex at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
ijl_toplevel_eval_in at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
eval at ./boot.jl:368 [inlined]
eval_user_input at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-macmini-x64-5.0/build/default-macmini-x64-5-0/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:151
repl_backend_loop at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-macmini-x64-5.0/build/default-macmini-x64-5-0/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:247
start_repl_backend at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-macmini-x64-5.0/build/default-macmini-x64-5-0/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:232
#run_repl#47 at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-macmini-x64-5.0/build/default-macmini-x64-5-0/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:369
run_repl at /Users/julia/.julia/scratchspaces/a66863c6-20e8-4ff4-8a62-49f30b1f605e/agent-cache/default-macmini-x64-5.0/build/default-macmini-x64-5-0/julialang/julia-release-1-dot-8/usr/share/julia/stdlib/v1.8/REPL/src/REPL.jl:355
jfptr_run_repl_63566.clone_1 at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/sys.dylib (unknown line)
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
#967 at ./client.jl:419
jfptr_YY.967_56999.clone_1 at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/sys.dylib (unknown line)
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
jl_f__call_latest at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
#invokelatest#2 at ./essentials.jl:729 [inlined]
invokelatest at ./essentials.jl:726 [inlined]
run_main_repl at ./client.jl:404
exec_options at ./client.jl:318
_start at ./client.jl:522
jfptr__start_57423.clone_1 at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/sys.dylib (unknown line)
ijl_apply_generic at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
true_main at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
jl_repl_entrypoint at /Users/jagot/.julia/juliaup/julia-1.8.5+0.x64.apple.darwin14/lib/julia/libjulia-internal.1.8.dylib (unknown line)
Allocations: 19584391 (Pool: 19573667; Big: 10724); GC: 22
```

Environment:
```julia
Status `~/work/projects/move-to-pythoncall/Project.toml`
[84fb645a] Jagot v0.1.0 `~/.julia/dev/Jagot`
[6099a3de] PythonCall v0.9.12
[274fc56d] PythonPlot v1.0.2
[295af30f] Revise v3.5.2
```

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Đánh giá

Issue này chưa được đánh giá.

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.