同一局域网内控制两台PC执行Python脚本的最优方案是什么
局域网多机Python API调用方案
以下两种方案均不需要开放公网端口,所有通信仅在本地局域网内完成,适配你提到的两款终端的厂商限制。
方案1:SSH远程执行(最小开发成本,适合低频调用)
这是门槛最低的实现方式,无需部署额外中间件:
- 两台数据PC(装有Eikon和Bloomberg的设备)开启系统自带的OpenSSH服务:Windows系统可直接在「设置>应用>可选功能」中搜索安装OpenSSH服务器,启动后设置为开机自启。在Windows防火墙中新建入站规则,仅允许你的开发机局域网IP访问22端口,禁止其他所有IP访问,完全符合安全要求。
- 两台数据PC本地提前写好对应API的调用脚本,直接将返回结果打印到标准输出即可,无需修改原有API调用逻辑。
- 开发机安装
paramiko库,通过SSH远程执行两台PC上的脚本,直接获取返回结果。
示例开发机调用代码:
import paramiko def run_remote_script(host, username, password, script_path): ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(host, username=username, password=password, port=22) stdin, stdout, stderr = ssh.exec_command(f'python {script_path}') result = stdout.read().decode() err = stderr.read().decode() ssh.close() return result, err # 调用Eikon设备拉取数据 eikon_data, eikon_err = run_remote_script( host="192.168.3.102", username="eikon_pc_local_user", password="your_password", script_path="C:\\scripts\\eikon_fetch.py" ) # 调用Bloomberg设备拉取数据 bbg_data, bbg_err = run_remote_script( host="192.168.3.103", username="bloomberg_pc_local_user", password="your_password", script_path="C:\\scripts\\bloomberg_fetch.py" )
方案2:局域网消息队列(适合高频/异步批量调用)
如果需要频繁拉取数据、做任务调度,推荐用本地消息队列实现异步通信:
- 选择任意一台局域网设备(推荐你的开发机)部署Redis/RabbitMQ,防火墙仅允许三台设备的局域网IP访问消息队列端口,不对外暴露。
- 两台数据PC上常驻Python消费者脚本,监听消息队列的任务指令,收到指令后调用本地API拉取数据,再将结果写回消息队列。
- 开发机作为生产者发送拉取任务,异步等待结果返回即可。
示例Eikon设备常驻消费者代码:
import redis import eikon as ek import pandas as pd # 连接局域网内的Redis r = redis.Redis(host="192.168.3.101", password="your_redis_password", decode_responses=False) ek.set_app_key('你的Eikon应用密钥') while True: # 阻塞等待拉取任务 _, task_msg = r.brpop("eikon_task_queue", timeout=0) task_params = eval(task_msg.decode()) # 调用本地Eikon API data, err = ek.get_data(instruments=task_params["rics"], fields=task_params["fields"]) # 结果写回队列 r.lpush("eikon_result_queue", data.to_json())
示例开发机发送任务代码:
import redis import pandas as pd r = redis.Redis(host="192.168.3.101", password="your_redis_password", decode_responses=False) # 推送拉取任务 r.lpush("eikon_task_queue", str({ "rics": ["000001.SZ", "AAPL.O"], "fields": ["TR.PriceClose", "TR.Volume"] })) # 阻塞等待结果返回 _, result_msg = r.brpop("eikon_result_queue", timeout=30) df = pd.read_json(result_msg.decode())
注意:两款终端的API调用需遵守厂商的使用许可条款,不要超出授权范围拉取数据。
内容的提问来源于stack exchange,提问作者lobuteing
相关产品推荐
相关产品推荐

