客户端运行Python脚本调用远程服务器已安装依赖包问题咨询
远程调用服务器Python依赖实现方案
你当前的基础socket仅完成了双向连通的基础能力,要实现调用服务端已安装依赖,只需要在现有通信逻辑上补充请求、执行、返回的三段逻辑即可:
- 客户端发送结构化数据(包含要调用的依赖名、方法名、入参)到服务端
- 服务端收到请求后本地调用对应依赖的方法,执行完成后把结果序列化后回传给客户端
- 客户端收到结果后反序列化即可直接使用
如果不想自己手动处理socket的封包、序列化逻辑,可以直接用Python自带的xmlrpc模块实现,代码示例如下:
服务端代码
from xmlrpc.server import SimpleXMLRPCServer import mediapipe as mp # 服务端提前装好你要共享的依赖 # 把要对外提供的依赖方法封装成可调用函数 def run_mediapipe_pose(image_bytes): # 这里写你要调用mediapipe的具体逻辑,比如姿态检测 with mp.solutions.pose.Pose(static_image_mode=True) as pose: results = pose.process(image_bytes) # 把结果转为可序列化的格式返回,比如关键点坐标列表 return [[lmk.x, lmk.y, lmk.z] for lmk in results.pose_landmarks.landmark] if results.pose_landmarks else [] if __name__ == "__main__": server = SimpleXMLRPCServer(("0.0.0.0", 56789), allow_none=True) # 注册要对外暴露的函数 server.register_function(run_mediapipe_pose, "run_mediapipe_pose") print("服务端启动,端口56789") server.serve_forever()
客户端代码
import xmlrpc.client import cv2 # 连接服务端 proxy = xmlrpc.client.ServerProxy("http://你的服务器IP:56789/") # 读取要处理的图片,转成字节流发送 img = cv2.imread("test.jpg") _, img_bytes = cv2.imencode(".jpg", img) # 调用服务端的mediapipe方法 pose_results = proxy.run_mediapipe_pose(img_bytes.tobytes()) # 直接使用返回的结果 print(pose_results)
注意:生产环境使用请补充IP白名单、请求鉴权、异常捕获逻辑,避免未授权访问和服务端崩溃。
PyInstaller打包mediapipe报错解决方案
针对Python3.8.4版本,按照以下步骤排查解决:
- 先确认mediapipe版本,Python3.8最高支持mediapipe 0.8.11版本,版本过高会直接不兼容,执行命令固定版本:
pip install mediapipe==0.8.11 - 打包时补充隐藏导入参数,PyInstaller默认无法自动识别mediapipe的底层依赖模块,打包命令修改为:
pyinstaller -F --hidden-import="mediapipe.python._framework_bindings" 你的脚本文件名.py - 如果仍报模块缺失或dll找不到错误,打包时手动指定mediapipe的资源文件路径,Windows系统打包命令示例:
pyinstaller -F --hidden-import="mediapipe.python._framework_bindings" --add-data "C:/你的Python安装路径/Lib/site-packages/mediapipe/modules;mediapipe/modules" 你的脚本文件名.py
Mac/Linux系统把命令里的分号改为冒号即可。
内容的提问来源于stack exchange,提问作者hectic
相关产品推荐
相关产品推荐

