读取 ,行 1 到 50

读取 ,行 1 到 30

读取 ,行 1 到 50

搜索文本 WindPy (**/data/fetcher.py),3 个结果

读取 ,行 180 到 230

这是一个非常经典且实用的场景。

直接回答: 在 Linux Docker 容器中无法直接调用宿主机(Windows)上的 Wind 终端,因为 Docker 容器是隔离的,且 Wind 的 Python 接口(WindPy)在 Windows 上依赖 COM 组件通信,这在 Linux 环境下是不存在的。

解决方案:搭建 “Wind 桥接器” (Wind Bridge)

我们可以采用 C/S 架构 来解决这个问题:

  1. 服务端(Windows):在你的 Windows 上运行一个简单的 Python 脚本,它负责连接本地的 Wind 终端。
  2. 客户端(Docker Linux):在容器里,我们写一个“伪装”的 Wind 接口,通过网络(RPC)把请求发给 Windows,Windows 执行完后把数据传回来。

这样做的好处是:Docker 里的代码完全不用改(或者改动极小),就像在本地跑 Wind 一样。

我为你准备了全套代码:

第一步:在 Windows 上运行 “服务端”

请在你的 Windows 宿主机 上创建一个文件 wind_server.py,并运行它。 (你需要先在 Windows 上 pip install rpyc WindPy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# wind_server.py (放在 Windows 上运行)
import rpyc
from rpyc.utils.server import ThreadedServer
from WindPy import w

class WindService(rpyc.Service):
    def on_connect(self, conn):
        print("Docker 客户端已连接")
        if not w.isconnected():
            w.start()
    
    def on_disconnect(self, conn):
        print("Docker 客户端已断开")

    def exposed_wsi(self, *args, **kwargs):
        print(f"请求 wsi: {args}")
        data = w.wsi(*args, **kwargs)
        # RPyC 传输复杂对象可能受限,这里简单序列化一下核心数据
        return {
            "ErrorCode": data.ErrorCode,
            "Codes": data.Codes,
            "Fields": data.Fields,
            "Times": data.Times,
            "Data": data.Data
        }

    def exposed_wsd(self, *args, **kwargs):
        print(f"请求 wsd: {args}")
        data = w.wsd(*args, **kwargs)
        return {
            "ErrorCode": data.ErrorCode,
            "Codes": data.Codes,
            "Fields": data.Fields,
            "Times": data.Times,
            "Data": data.Data
        }
        
    def exposed_isconnected(self):
        return w.isconnected()

    def exposed_start(self, *args, **kwargs):
        return w.start(*args, **kwargs)

if __name__ == "__main__":
    print("正在启动 Wind 桥接服务 (端口 18812)...")
    w.start()
    t = ThreadedServer(WindService, port=18812, protocol_config={'allow_public_attrs': True})
    t.start()

第二步:在 Docker (Linux) 中配置 “客户端”

我会在你的工作区创建一个 utils/wind_bridge_client.py,它会模拟 WindPy 的行为,但是通过网络连接到 Windows。

你需要先安装 rpyc

1
pip install rpyc

我来帮你创建客户端代码和修改 fetcher.py。

1. 创建 utils/wind_bridge_client.py

已创建

已创建

正在使用 “替换文件中的字符串”

这是一个非常经典的需求。由于 Wind 的 Python 接口(WindPy)在 Windows 上依赖本地的 COM 组件与 Wind 终端通信,而 Linux Docker 容器无法直接访问宿主机的 COM 组件,因此直接在 Docker 里运行 WindPy 是行不通的

但是,我们可以通过**“代理桥接” (Bridge)** 的方式完美解决这个问题。

解决方案架构

  1. 服务端 (Windows 宿主机):运行一个 Python 脚本,它能访问本地的 Wind 终端,并通过网络(RPC)暴露接口。
  2. 客户端 (Linux Docker):运行你的实盘策略,通过网络连接到宿主机的脚本,像调用本地 WindPy 一样调用远程数据。

我已经为你准备好了全套代码:

第一步:在 Windows 宿主机上运行 “桥接服务”

你需要把 wind_bridge_server.py 复制到你的 Windows 电脑上(任意位置),然后运行它。

前提:

  1. Windows 上已安装 Python。
  2. Windows 上已安装 WindPyrpyc (pip install WindPy rpyc)。
  3. Wind 终端已登录。

运行命令 (Windows CMD/PowerShell):

1
python wind_bridge_server.py

这个脚本会监听 18812 端口,等待 Docker 里的程序来请求数据。

第二步:Docker 内部的自动适配

我已经修改了你的项目代码,使其能够自动识别并连接这个桥接服务。

  1. 创建了客户端适配器 (wind_bridge_client.py):

    • 这是一个模拟的 w 对象。
    • 它会自动连接 host.docker.internal (Docker 访问宿主机的专用地址)。
    • 它将 w.wsi, w.wsd 等请求转发给 Windows。
  2. 修改了数据获取模块 (fetcher.py):

    • 现在它会先尝试导入本地 WindPy
    • 如果失败(在 Linux Docker 里通常会失败),它会自动切换使用 utils.wind_bridge_client

如何验证

  1. 在 Windows 上启动 wind_bridge_server.py
  2. 在 Docker 容器里,你可以直接运行之前的同步脚本来测试:
1
2
# 在 Docker 终端中
python scripts/run_trading.py -s TL2512 -n BollingerMeanReversionStrategy

或者手动测试连接:

1
2
3
4
5
# 在 Docker 的 python console 中
from utils.wind_bridge_client import w
w.start()
print(w.isconnected())
# 应该输出 True

这样,你的 Linux 实盘环境就能无缝利用 Windows 上的 Wind 终端获取实时数据了。

已进行更改。