如何在本地Python环境使用彭博BQL?遇zmq模块属性错误
在本地Python环境中使用彭博BQL的可行方案求助
之前可在彭博终端外通过Python调用BQL,但当前该方法失效。复制相关包/文件后,出现AttributeError: module 'zmq.eventloop' has no attribute 'ioloop'错误,据了解这是尝试在沙箱化终端版本外访问导致的。请问有没有人找到在本地Python中使用BQL的方法?
完整回溯信息如下:
AttributeError Traceback (most recent call last) Cell In[4], line 4 1 import pandas as pd 2 import bql ----> 4 bq = bql.Service() 5 query = """get(px_last)for('AAPL US EQUITY')with(dates=range(-1y,0d),fill='prev')""" 6 data = bql.combined_df(bq.execute(query)).reset_index() File c:\Users\user\OneDrive\python311\Lib\site-packages\bql\service.py:306, in Service.__init__(self, metadata_reader, request_executor, preferences, query_parser) 295 """Construct a new Service object. 296 297 Specify `preferences` if you want certain preferences applied to each (...) 302 precedence over the global preferences specified here. 303 """ 304 self.__bqapi_session = None 305 self.__metadata_reader = (metadata_reader or --> 306 self.__create_metadata_reader()) 307 self._request_executor = (request_executor or 308 self.__create_request_executor()) 309 self._query_parser = query_parser or self.__create_query_parser() File c:\Users\user\OneDrive\python311\Lib\site-packages\bql\service.py:324, in Service.__create_metadata_reader(self) 322 def __create_metadata_reader(self): 323 factory = MetadataReaderFactory() --> 324 return factory.create_metadata_reader() File c:\Users\user\OneDrive\python311\Lib\site-packages\bqlmetadata\metadata_reader_factory.py:63, in MetadataReaderFactory.create_metadata_reader(self) 60 def create_metadata_reader(self): 61 import bqapi ---> 63 bqapi_session = bqapi.get_session_singleton() 65 bqhopper_breg_value = _get_bqhopper_enablement() 67 if bqhopper_breg_value == 0: 68 # BREG value of 0 will use the legacy, local SQLite 69 # metadata solution or shipped metadata. File c:\Users\user\OneDrive\python311\Lib\site-packages\bqapi\session_singleton.py:73, in get_session_singleton(settings) 70 # see if we already have a blp api session created for this cache key 71 if key not in _instances: 72 # create a new blp api session, store it in the cache with key ---> 73 _instances[key] = Session(**(settings or {})) 75 return _instances[key] File c:\Users\user\OneDrive\python311\Lib\site-packages\bqapi\session.py:93, in Session.__init__(self, event_loop, **settings) 68 def __init__(self, event_loop=None, **settings): 69 """Constructor for :class:`Session` instances. 70 71 After constructing a Session object, the session is automatically started (...) 91 Session settings. See the :class:`Settings` class for more details. 92 """ ---> 93 self.event_loop = event_loop or get_default_event_loop() 95 self._settings = Settings(**settings) 96 self._logger = logging.getLogger('bqapi.Session') File c:\Users\user\OneDrive\python311\Lib\site-packages\bqapi\event_loop.py:518, in get_default_event_loop() 516 global _default_loop 517 if not _default_loop: ---> 518 _ipython_loop = _get_ipython_event_loop() 519 if _ipython_loop: 520 _default_loop = EventLoop( 521 external_loop=TornadoEventLoop(_ipython_loop)) File c:\Users\user\OneDrive\python311\Lib\site-packages\bqapi\event_loop.py:499, in _get_ipython_event_loop() 492 return None 494 # Not needed, we are running a ZMQ kernel now... 495 # kernel = ipython.kernel 496 # if not isinstance(kernel, IPython.kernel.zmq.ipkernel.IPythonKernel): 497 # return None ---> 499 return zmq.eventloop.ioloop.IOLoop.instance() 500 except WindowsError: 501 # Happens when we are in a sandbox and not allowed to load the ZMQ 502 # native DLL. Treat it like an import error; if ZMQ was supposed to 503 # be allowed in the sandbox, it should have been imported before 504 # lowering the token. 505 return None AttributeError: module 'zmq.eventloop' has no attribute 'ioloop'
可行解决方案
1. 版本兼容修复
你遇到的zmq.eventloop错误是因为pyzmq版本过高,彭博bqapi依赖旧版pyzmq的ioloop模块结构。可以降级到兼容版本:
pip install pyzmq==19.0.2 pip install tornado==6.1
2. 官方合规部署方式
彭博目前对终端外BQL访问有明确的官方支持路径:
- 使用Bloomberg Anywhere远程桌面环境运行Python,该环境自带预配置的BQL包,无需手动复制文件。
- 联系彭博客户支持,申请启用BQL API for Local Python权限,官方会提供合规安装包和配置指南,规避沙箱限制问题。
3. 替代方案:改用BLPAPI
如果暂时无法解决BQL的沙箱限制,可以使用彭博底层的BLPAPI,它支持本地Python环境调用且不受沙箱限制,示例代码:
import blpapi # 配置会话参数 session_options = blpapi.SessionOptions() session_options.setServerHost("localhost") session_options.setServerPort(8194) # 启动会话并打开服务 session = blpapi.Session(session_options) if not session.start(): print("会话启动失败") exit() if not session.openService("//blp/refdata"): print("无法打开参考数据服务") exit() # 构造请求并发送 ref_data_service = session.getService("//blp/refdata") request = ref_data_service.createRequest("ReferenceDataRequest") request.append("securities", "AAPL US EQUITY") request.append("fields", "PX_LAST") session.sendRequest(request) # 处理响应 while True: event = session.nextEvent(500) for msg in event: print(msg) if event.eventType() == blpapi.Event.RESPONSE: break session.stop()
内容的提问来源于stack exchange,提问作者mkt_troglodyte
相关产品推荐
相关产品推荐

