You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在本地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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 20:21:07