使用IBM Language Translator时遇ssl模块无TLSVersion属性错误求助
解决IBM Watson Language Translator V3 API调用中的AttributeError问题
问题场景
调用IBM Watson Language Translator V3 API实现英法互译时,运行包含IAM认证逻辑的Python代码触发AttributeError: module 'ssl' has no attribute 'TLSVersion',无法正常完成翻译功能。
原代码
import json from ibm_watson import LanguageTranslatorV3 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator apikey="tDc3PeMIIGCoTfNU7emYTw8cBLO4rZdVPiBiuvO2LBu6" url="https://api.au-syd.language-translator.watson.cloud.ibm.com/instances/ad9dda42-945e-471e-b6a7-6fd0edadeeec" authenticator = IAMAuthenticator(apikey) language_translator = LanguageTranslatorV3(version='2018-05-01',authenticator=authenticator) language_translator.set_service_url(url) translation = language_translator.translate(text='Hello, how are you today?',model_id='en-fr').get_result() print(json.dumps(translation, indent=2, ensure_ascii=False)) def englishToFrench(englishText): frenchText = language_translator.translate( text=englishText, model_id='en-fr').get_result() print(json.dumps(frenchText, indent=2, ensure_ascii=False)) return frenchText def frenchToEnglish(frenchText): englishText = language_translator.translate( text=frenchText, model_id='en-fr').get_result() print(json.dumps(englishText, indent=2, ensure_ascii=False)) return englishText
报错信息
Traceback (most recent call last): File "translator.py", line 9, in <module> language_translator = LanguageTranslatorV3(version='2018-05-01',authenticator=authenticator) File "/home/theia/.local/lib/python3.6/site-packages/ibm_watson/language_translator_v3.py", line 76, in __init__ authenticator=authenticator) File "/home/theia/.local/lib/python3.6/site-packages/ibm_cloud_sdk_core/base_service.py", line 97, in __init__ self.http_adapter = SSLHTTPAdapter() File "/home/theia/.local/lib/python3.6/site-packages/ibm_cloud_sdk_core/utils.py", line 35, in __init__ super().__init__(*args, **kwargs) File "/home/theia/.local/lib/python3.6/site-packages/requests/adapters.py", line 130, in __init__ self.init_poolmanager(pool_connections, pool_maxsize, block=pool_block) File "/home/theia/.local/lib/python3.6/site-packages/ibm_cloud_sdk_core/utils.py", line 42, in init_poolmanager ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2 AttributeError: module 'ssl' has no attribute 'TLSVersion'
报错原因
ssl.TLSVersion是Python 3.7及以上版本才新增的属性,而当前使用的Python版本是3.6,不支持该属性。IBM Cloud SDK的核心库在初始化HTTP适配器时会尝试设置这个属性,导致报错。
另外原代码中frenchToEnglish函数的model_id错误,应该使用fr-en而非en-fr,否则会把法语重复翻译成法语,无法得到正确的英文结果。
解决方案
方案1:升级Python版本
将Python版本升级到3.7或更高版本,这样ssl模块会自带TLSVersion属性,直接解决该报错。
方案2:降级IBM Cloud SDK版本
安装兼容Python 3.6的IBM Cloud SDK核心库版本,比如指定版本2.13.0:
pip install ibm-cloud-sdk-core==2.13.0
该版本不会使用ssl.TLSVersion来设置TLS版本,适配Python 3.6环境。
方案3:手动修改SDK代码(应急方案,不推荐)
找到ibm_cloud_sdk_core/utils.py文件,将其中的:
ssl_context.minimum_version = ssl.TLSVersion.TLSv1_2
替换为Python 3.6兼容的写法:
ssl_context.options |= ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1
这种方法需要修改第三方库文件,后续更新SDK会覆盖修改,仅作为临时应急使用。
修正后的代码
import json from ibm_watson import LanguageTranslatorV3 from ibm_cloud_sdk_core.authenticators import IAMAuthenticator apikey="tDc3PeMIIGCoTfNU7emYTw8cBLO4rZdVPiBiuvO2LBu6" url="https://api.au-syd.language-translator.watson.cloud.ibm.com/instances/ad9dda42-945e-471e-b6a7-6fd0edadeeec" authenticator = IAMAuthenticator(apikey) language_translator = LanguageTranslatorV3(version='2018-05-01',authenticator=authenticator) language_translator.set_service_url(url) translation = language_translator.translate(text='Hello, how are you today?',model_id='en-fr').get_result() print(json.dumps(translation, indent=2, ensure_ascii=False)) def englishToFrench(englishText): frenchText = language_translator.translate( text=englishText, model_id='en-fr').get_result() print(json.dumps(frenchText, indent=2, ensure_ascii=False)) return frenchText def frenchToEnglish(frenchText): # 修正model_id为fr-en englishText = language_translator.translate( text=frenchText, model_id='fr-en').get_result() print(json.dumps(englishText, indent=2, ensure_ascii=False)) return englishText
内容的提问来源于stack exchange,提问作者Atharva Dhorje
相关产品推荐
相关产品推荐

