UndefVarError: active_repl not defined

我最近在尝试把一个Julia0.4上的包IDL升级到1.3,但是在有关REPL的部分遇到了问题。这个包支持在Julia中嵌入IDL的命令行,我做了些改动后,目前如果直接using IDL, 再敲入>,那么的确可以成功地进入命令行。但是如果进行包的测试,

(v1.3) pkg> activate .
Activating environment at `~/Documents/Computer/Julia/IDL/Project.toml`
(IDL) pkg> test
   Testing IDL
 Resolving package versions...
ERROR: LoadError: InitError: UndefVarError: active_repl not defined
Stacktrace:
 [1] idl_repl() at /Users/hyzhou/Documents/Computer/Julia/IDL/src/IDLREPL.jl:10
 [2] __init__() at /Users/hyzhou/Documents/Computer/Julia/IDL/src/IDL.jl:41
 [3] _include_from_serialized(::String, ::Array{Any,1}) at ./loading.jl:692
 [4] _require_from_serialized(::String) at ./loading.jl:743
 [5] _require(::Base.PkgId) at ./loading.jl:1034
 [6] require(::Base.PkgId) at ./loading.jl:922
 [7] require(::Module, ::Symbol) at ./loading.jl:917
 [8] include at ./boot.jl:328 [inlined]
 [9] include_relative(::Module, ::String) at ./loading.jl:1105
 [10] include(::Module, ::String) at ./Base.jl:31
 [11] include(::String) at ./client.jl:424
 [12] top-level scope at none:6
during initialization of module IDL
in expression starting at /Users/hyzhou/Documents/Computer/Julia/IDL/test/runtests.jl:1
ERROR: Package IDL errored during testing

就会出现问题。active_repl这个函数是在这里使用的。各位有了解原因的吗?为什么会显示找不到函数?

英文原帖

你这个 IDL 指的是 Interactive Data Language ,开源实现为 gnudatalanguage/gdl 商业软件为 ENVI/IDL

还是 Interface description language

IDL

active_repl 是个全局变量,在开启 REPL 的时候设置,你在测试的时候就没有这个变量。

既然这个包已经能用了,测试的时候就可以绕开 REPL 相关的测试,或者重新开一个测试用的 REPL。

# run the requested sort of evaluation loop on stdio
function run_main_repl(interactive::Bool, quiet::Bool, banner::Bool, history_file::Bool, color_set::Bool)
    global active_repl

类似的问题

尝试了下
加上

    if !isdefined(Base, :active_repl)
        term = REPL.Terminals.TTYTerminal("", stdin, stdout, stderr)
        active_repl = REPL.LineEditREPL(term, true)
    end

    repl = active_repl

后,会在 main_mode = repl.interface.modes[1] 这句报错,因为新生成的 REPL 没有 interface 这个属性。
你可以继续手工添加需要的属性。


另外我用 IDL 8.5.1 测试的时候,callable_init() 调用的函数应该为 :IDL_Initialize
DLL Export Viewer 看一下 idl.dll 的导出函数表就知道了,其他的函数目前还没发现问题,基本都有

1 个赞

感谢解惑!关于REPL的部分,我决定如果在测试中就直接返回了,比较合理。

另外callable_init()部分,我依旧会出现问题:

ERROR: InitError: error compiling __init__: error compiling callable_init: could not load library "/Applications/exelis/idl85/bin/bin.darwin.x86_64/libidl.dylib"
dlopen(/Applications/exelis/idl85/bin/bin.darwin.x86_64/libidl.dylib, 1): Library not loaded: libMesaGLU6_2.dylib
  Referenced from: /Applications/exelis/idl85/bin/bin.darwin.x86_64/libidl.dylib
  Reason: image not found

注意它显示的不是找不到函数,而是dlopen打不开库。


我还有一个小问题:每次我调用这个IDL RPC库结束以后,我发现里面我设置的变量啊函数啊都不会在退出Julia时重制,于是我必须自己IDL.reset()。那么如何才能自动让这个调用的库重置呢?

你可能需要手动硬编码路径。

issue 里是原作者。。。一种循环


不如在导入这个包的时候重置。

估计是 julia 退出了,但 rpc 服务端没退出。
你也可以找找 julia 退出时,能不能执行一些操作,但这个看起来就坑不少,退出的形式多种多样。
还是不如在导入包的时候重置。

1 个赞

一开始我还没反应过来,点开看后恍然大悟…不告诫一下后人,屡屡踩坑。