Ubuntu Python脚本访问Windows Cosmos DB模拟器报错求助
排查Ubuntu访问Azure Cosmos DB模拟器时
find_collection的模糊错误 首先,我注意到你已经解决了SSL证书验证的问题,但现在遇到了一个非常模糊的顶层错误。这种无具体信息的报错通常是因为异常未被正确捕获输出,或是基础的连接/资源存在性出了问题。我们一步步来拆解排查:
1. 先确认核心资源与配置的正确性
- 你注释掉了
client.CreateDatabase({"id": DATABASE_ID}),所以必须确保Windows模拟器中已经手动创建了DATABASE_ID对应的数据库,且COLLECTION_ID的集合也存在于该数据库内。如果数据库不存在,QueryCollections调用会直接失败,但当前的异常处理没有输出足够细节。 - 检查你的
config.py配置项:HOST必须填写Windows机器的实际IP(比如http://192.168.x.x:8081),不能用localhost(因为Ubuntu是独立机器,无法通过localhost访问Windows模拟器)。MASTER_KEY要和Windows模拟器的主密钥完全一致(可以在模拟器的「密钥」页面复制)。- 确保Windows模拟器已经开启远程访问权限:打开模拟器设置,勾选「允许来自远程机器的连接」,同时Windows防火墙要开放8081端口。
2. 增强异常捕获,获取完整错误信息
当前的顶层异常只打印了args和message,但pydocumentdb的错误包含状态码、错误详情等关键信息。修改代码添加traceback打印,就能看到具体出错行和完整错误栈:
import traceback # 导入traceback模块 if __name__ == '__main__': try: run_sample() except Exception as e: print("Top level Error: args:{0}, message:{1}".format(e.args,e.message)) # 添加完整错误栈打印 print("\n完整错误详情:") traceback.print_exc()
同时,在run_sample的HTTPFailure捕获中,补充更多错误细节:
except errors.HTTPFailure as e: print('\nrun_sample捕获到错误:状态码 {0},错误信息 {1}'.format(e.status_code, e.message))
3. 验证模拟器的远程连接是否正常
在Ubuntu机器上,先用curl测试连接模拟器的数据库,确认网络和权限没问题:
curl -k https://<windows-ip>:8081/dbs/<DATABASE_ID> -H "Authorization: type=master&ver=1.0&sig=<MASTER_KEY>"
如果返回数据库的JSON结构,说明连接正常;如果报错,根据curl的提示排查网络或权限问题。
4. 检查pydocumentdb版本兼容性
旧版本的pydocumentdb可能和最新的Cosmos DB模拟器不兼容,尝试更新到最新版本:
pip install --upgrade pydocumentdb
5. 临时测试:跳过证书验证(仅用于排查)
虽然你已经导入了证书,但可以临时跳过验证来确认是否还有证书相关的潜在问题(注意:生产环境绝对不要这么做):
修改DocumentClient的初始化代码,添加自定义连接策略:
from pydocumentdb.connection_policy import ConnectionPolicy from pydocumentdb.https_connection import HttpsConnection # 自定义连接策略,跳过证书验证 connection_policy = ConnectionPolicy() connection_policy.SSLConfiguration = HttpsConnection(verify=False) with IDisposable(document_client.DocumentClient(HOST, {'masterKey': MASTER_KEY}, connection_policy=connection_policy )) as client: # 后续代码保持不变
如果跳过验证后错误消失,说明证书导入过程可能有问题,比如证书格式不正确(确保导出的是PEM格式,复制到Ubuntu后没有损坏)。
按照这些步骤排查,应该能快速定位问题根源。最常见的情况是:Windows模拟器未开启远程访问、配置文件中的HOST/密钥错误,或是目标数据库/集合不存在。
内容的提问来源于stack exchange,提问作者Nayan Goswami
相关产品推荐
相关产品推荐

