Python3.8启动Cassandra2.1.1的cqlsh报SaferScanner RE标志设置错误
核心问题原因
Cassandra 2.1.1 自带的cqlsh工具是适配Python 2.7开发的,与当前使用的Python 3.8存在多维度不兼容:
- 代码层用
is not判断字符串字面量,会触发Python3的语法告警 - 内置的正则安全校验模块
SaferScanner基于老版本Python2的re模块实现,Python3.8的re.sre_parse会自动为子正则附加默认flag位(对应报错里的0b110010,是系统自动生成的状态值,并非用户在正则里嵌入的自定义flag),老的校验逻辑会把这部分系统生成的flag识别为违规内嵌正则标记,直接抛出ValueError终止启动。
可落地解决方案
方案1(零修改,最稳定)
安装Python 2.7,注意不要和现有Python3.8的环境混装,配置好对应解释器路径后,直接用Python2.7解释器启动cqlsh,示例命令:
C:\Python27安装目录\python.exe C:\Users\manjr\.ccm\repository\2.1.1\bin\cqlsh
该方式完全适配Cassandra 2.1.1的原生逻辑,是CCM运行Cassandra 2.x版本的常规配套方式,不会触发兼容问题。
方案2(强制用Python3.8的修改方式)
如果必须使用现有Python3.8环境运行cqlsh,修改两处文件即可正常启动:
- 打开cqlsh脚本,定位到第491行,将
调整为if custom_prompt is not '':
消除语法告警。if custom_prompt != '': - 打开
C:\Users\manjr\.ccm\repository\2.1.1\pylib\cqlshlib\saferscanner.py,定位到scrub_sub方法里的抛错逻辑:原逻辑只要检测到正则解析后的flag值和传入的全局flag不一致就抛错,把判断条件调整为:仅当识别到用户主动在正则内嵌入的flag语法(比如(?i)、(?m)这类内联标记)时才拦截,放行Python3.8自动附加的系统默认flag,即可跳过报错。
方案3
通过pip工具安装与Cassandra 2.1大版本匹配的独立cqlsh工具,绕开Cassandra安装目录下自带的不兼容cqlsh脚本,安装完成后直接在命令行执行cqlsh即可连接本地CCM搭建的虚拟节点。
内容的提问来源于stack exchange,提问作者Sarang Manjrekar
相关产品推荐
相关产品推荐

