You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Python环境中调试通过juliacall调用的Julia函数?

如何在Python环境中调试通过juliacall调用的Julia函数?

我完全懂这种抓心的痛点——用juliacall在Python框架里跑Julia写的函数,VS Code的Python和Julia扩展各自的调试工具都挺好用,但就是没法在Julia函数里触发断点,两边调试完全脱节,太闹心了!

下面分享两个亲测有效的方法,都是在VS Code里就能搞定的:

方法一:远程调试联动(最贴合VS Code可视化调试)

这是我最常用的方式,能直接用VS Code的Julia调试面板控制断点:

  • 第一步:先给Julia搭好调试监听
    打开你写Julia函数的脚本,在VS Code左侧调试面板(那个虫子图标)里,点击「创建launch.json文件」,选择「Julia」→「Remote Debug (Listen)」配置。启动这个调试会话后,VS Code底部会显示Julia调试服务器正在监听的端口(默认是localhost:9999)。
  • 第二步:让Python的juliacall连接到调试服务器
    在你的Python代码最开头,先设置环境变量指定调试服务器地址,再导入juliacall:
    import os
    # 这里的端口要和Julia调试服务器的监听端口一致
    os.environ["JULIA_DEBUG_SERVER"] = "localhost:9999"
    from juliacall import Main as jl
    
  • 第三步:启动调试
    在Julia函数里设好你需要的断点,然后启动VS Code的Python调试会话(选普通的Python: Current File配置就行)。当Python代码调用到Julia函数时,就会自动触发Julia那边的断点,你可以在VS Code里查看Julia变量、单步执行、跳过代码,和调试纯Julia代码完全一样!

方法二:用Julia Debugger包临时调试

如果只是临时排查问题,不想搭远程服务器,这个方法更快捷:

  • 先在Julia环境里装Debugger包:打开Julia REPL,输入using Pkg; Pkg.add("Debugger")
  • 在你的Python代码里,先让Julia加载Debugger,然后用@enter宏包裹要调用的Julia函数:
    from juliacall import Main as jl
    # 让Julia加载Debugger包
    jl.eval("using Debugger")
    # 调用Julia函数时用@enter触发调试
    # 把my_julia_function和args换成你自己的函数和参数
    result = jl.eval("@enter my_julia_function(123, \"test\")")
    
    执行到这行时,VS Code的终端会切换到Julia的调试REPL,你可以用调试命令操作:n单步执行,s进入子函数,c继续执行到下一个断点,q退出调试。

几个要注意的小细节

  • 确保Julia和Python进程用的是同一个用户权限,不然可能连不上调试服务器。
  • 如果用了Python虚拟环境,要确认juliacall调用的Julia环境是你装了Debugger包的那个(可以用jl.eval("Pkg.status()")检查)。
  • 要是调试没触发,试试重启VS Code的Julia和Python扩展,有时候扩展缓存会搞事情。

内容来源于stack exchange

火山引擎 最新活动