JuliaPy / JuliaPy/PythonPlot.jl

behavior of KeyboardInterrupt?

Offen
#30 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
Vorherrschende Sprache
Julia
Sterne
85
Forks
9
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

During an interactive session where I am variously running computations and plotting things, when I try to keyboard interrupt a running computation, Python apparently gets interrupted instead; for example, notice what happens when I hit `Ctrl-C` during a `while true` block:
```
julia> using PythonPlot

julia> plot(range(0, 1, 101).^2)
Python: []

julia> while true # surrogate for some long computation that I decide I want to interrupt
5+2
sleep(0.1)
end
Error in Timer:
Python: KeyboardInterrupt:
Python stacktrace:
[1] __getattr__
@ tkinter C:\Users\zor_q\.julia\environments\v1.9\.CondaPkg\env\Lib\tkinter\__init__.py:2408
Stacktrace:
[1] pythrow()
@ PythonCall C:\Users\zor_q\.julia\packages\PythonCall\qTEA1\src\err.jl:94
[2] errcheck
@ C:\Users\zor_q\.julia\packages\PythonCall\qTEA1\src\err.jl:10 [inlined]
[3] pygetattr(x::PythonCall.Py, k::String)
@ PythonCall C:\Users\zor_q\.julia\packages\PythonCall\qTEA1\src\abstract\object.jl:60
[4] getproperty(x::PythonCall.Py, k::Symbol)
@ PythonCall C:\Users\zor_q\.julia\packages\PythonCall\qTEA1\src\Py.jl:261
[5] (::PythonPlot.var"#9#10"{PythonCall.Py, PythonCall.Py, PythonCall.Py})(async::Timer)
@ PythonPlot C:\Users\zor_q\.julia\packages\PythonPlot\f591M\src\pygui.jl:199
[6] macro expansion
@ .\asyncevent.jl:281 [inlined]
[7] (::Base.var"#702#703"{PythonPlot.var"#9#10"{PythonCall.Py, PythonCall.Py, PythonCall.Py}, Timer})()
@ Base .\task.jl:134
```
Meanwhile, the `while true` block continues running. If it were a computation that came to an end at some point, all future plotting would fail (I assume because the background Python process is no longer running?).

Is this the expected behavior? I would have hoped that the execution of the `while true` block would have been interrupted and Python would have been left alone.

For comparison, when using GR, it's the `while true` block that gets interrupted:
```
julia> using Plots # default backend is GR

julia> plot(range(0, 1, 101).^2) # plot window pops up

julia> while true # surrogate for long computation that I decide I want to interrupt
5+2
sleep(0.1)
end
ERROR: InterruptException:
Stacktrace:
[1] poptask(W::Base.IntrusiveLinkedListSynchronized{Task})
@ Base .\task.jl:974
[2] wait()
@ Base .\task.jl:983
[3] wait(c::Base.GenericCondition{Base.Threads.SpinLock}; first::Bool)
@ Base .\condition.jl:130
[4] wait
@ .\condition.jl:125 [inlined]
[5] _trywait(t::Timer)
@ Base .\asyncevent.jl:138
[6] wait
@ .\asyncevent.jl:155 [inlined]
[7] sleep
@ .\asyncevent.jl:240 [inlined]
[8] top-level scope
@ .\REPL[3]:3

julia> plot(range(0, 1, 101).^2) # still plots successfully

julia> backend()
Plots.GRBackend()
```

Beitragsleitfaden

Für dieses Repository ist kein Beitragsleitfaden indexiert

Bewertung

Dieses Issue wurde noch nicht bewertet.

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.