使用nbclient远程执行R内核时出现解析错误求助
nbclient执行R内核解析错误排查方案
问题描述
使用nbclient包远程执行R内核时触发解析错误,该包在Python 3.7/3.9内核环境下运行正常。错误核心提示为R解析器遇到意外输入,完整错误栈如下:
File "/code/proj/spawner/execution_backend/bivalve.py", line 160, in _execute self._results = self._notebook_client.execute(reset_kc=True, env=env) File "/build/venv/lib64/python3.6/site-packages/nbclient/util.py", line 75, in wrapped return just_run(coro(*args, **kwargs)) File "/build/venv/lib64/python3.6/site-packages/nbclient/util.py", line 54, in just_run return loop.run_until_complete(coro) File "/usr/lib64/python3.6/asyncio/base_events.py", line 484, in run_until_complete return future.result() File "/build/venv/lib64/python3.6/site-packages/nbclient/client.py", line 564, in async_execute cell, index, execution_count=self.code_cells_executed + 1 File "/build/venv/lib64/python3.6/site-packages/nbclient/client.py", line 839, in async_execute_cell self._check_raise_for_error(cell, cell_index, exec_reply) File "/build/venv/lib64/python3.6/site-packages/nbclient/client.py", line 755, in _check_raise_for_error raise CellExecutionError.from_cell_and_msg(cell, exec_reply['content']) nbclient.exceptions.CellExecutionError: An error occurred while executing the following cell: ------------------ __nbparams__ = {"__meta__": {"lookup_service": {"data": "{\"timestamp\": \"2022-09-30T14:46:18.491258\", \"user\": \"vkamat\", \"notebook\": 2431}", "signature": "630e510e60a286a17881fc513e54e54c"}}} globals().update(__nbparams__) ------------------ Error in parse(text = x, srcfile = src): <text>:1:1: unexpected input 1: _ ^ Traceback: ERROR: Error in parse(text = x, srcfile = src): <text>:1:1: unexpected input 1: _ ^
原因分析
触发错误的核心是跨语言语法不兼容:
- 执行的代码是Python语法(以
__开头的变量、globals().update()方法),但R语言解析器无法识别:- R虽允许变量名包含下划线,但对以双下划线
__开头的标识符解析存在兼容性问题 globals().update()是Python特有的全局环境更新方式,R中无对应语法
- R虽允许变量名包含下划线,但对以双下划线
解决方案
1. 适配R语法重写参数注入代码
将参数转换为R可识别的列表结构,并用R的方式加载到全局环境:
__nbparams__ <- list( __meta__ = list( lookup_service = list( data = '{"timestamp": "2022-09-30T14:46:18.491258", "user": "vkamat", "notebook": 2431}', signature = "630e510e60a286a17881fc513e54e54c" ) ) ) # 将列表元素加载到全局环境 list2env(__nbparams__, envir = .GlobalEnv)
2. 内核类型判断适配
在nbclient执行代码前,先检测目标内核类型(Python/R),根据内核类型注入对应语法的参数代码,避免跨语言语法冲突。例如在Python代码中添加分支判断:
# 假设已获取目标内核信息 kernel_type = get_kernel_type() # 自定义方法,返回"python"或"r" if kernel_type == "python": param_code = '''__nbparams__ = {"__meta__": {"lookup_service": {"data": "{\"timestamp\": \"2022-09-30T14:46:18.491258\", \"user\": \"vkamat\", \"notebook\": 2431}", "signature": "630e510e60a286a17881fc513e54e54c"}}} globals().update(__nbparams__)''' else: param_code = '''__nbparams__ <- list( __meta__ = list( lookup_service = list( data = '{"timestamp": "2022-09-30T14:46:18.491258", "user": "vkamat", "notebook": 2431}', signature = "630e510e60a286a17881fc513e54e54c" ) ) ) list2env(__nbparams__, envir = .GlobalEnv)''' # 执行对应代码 self._notebook_client.execute(cell=param_code, reset_kc=True, env=env)
内容的提问来源于stack exchange,提问作者Viraj Kamat
相关产品推荐
相关产品推荐

