python-rpc-windows服务器C#项目远程调用Linux服务器上的python脚本

news/2024/9/28 16:28:53/

环境:
win10,Python 3.9.13

参考:
Python3简单使用xmlrpc实现RPC - 简书
https://www.jianshu.com/p/9987913cf734


目录

  • 问题描述
  • 解决
    • 思路
    • server
    • client
    • debug

问题描述

之前写过:
c#远程调用linux服务器的Python脚本_c#远程登录其他服务器执行脚本-CSDN博客
https://blog.csdn.net/pxy7896/article/details/121473815

pythonnet-C#调用python脚本-含matplotlib+biopython_c# pythonnet 调用python脚本-CSDN博客
https://blog.csdn.net/pxy7896/article/details/141608138

目前遇到的问题是:

  1. 同事那边是windows系统、.net项目,她需要调用我这边linux服务器上的一个python脚本
  2. 该脚本涉及比较多的数据和程序,不方便挪动;同时,该脚本接收一个txt文件作为输入,处理后产生一个zip文件作为输出
  3. 使用远程调用的话,需要考虑文件的上传和下载功能

解决

思路

在linux和windows上分别实现server和client,.net项目里使用pythonnet调用client里的函数。

server

python"># _*_ coding:utf-8 _*_from xmlrpc.server import SimpleXMLRPCServer
from socketserver import ThreadingMixIn
import xmlrpc.client
import base64class ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):passdef file_output(name):'''下载文件name: 唯一标识符'''file_name = os.getcwd() + "/" + nameif not os.path.isfile(file_name):return f"Error: File '{name}' does not exist."with open(file_name, 'rb') as file:return file.read()def file_input(filename, filedata):'''上传文件file_name: 唯一标识符file_data: byte数据'''with open(filename, 'wb') as file:file.write(base64.b64decode(filedata))# do something ...return f"File {filename} saved successfully."if __name__ == '__main__':server = ThreadXMLRPCServer(('IP', 端口), allow_none=True) # 初始化server.register_function(file_input, 'file_input')server.register_function(file_output, 'file_output')print("Listening for Client")server.serve_forever() # 保持等待调用状态

如果只需要传数据,不需要传文件名,也可以这样写:

python"># 供客户端上传文件
def file_input(data):handle = open("xxx.txt", 'wb')handle.write(data.data)handle.close()

client

python"># _*_ coding:utf-8 _*_from xmlrpc.client import ServerProxy
import xmlrpc.client
import base64
import osserver_url = "http://IP:端口"def send_file(file_path):with open(file_path, 'rb') as file:filedata = file.read()file_name = os.path.basename(file_path)# 编码文件数据filedata_b64 = base64.b64encode(filedata).decode('utf-8')# 连接到服务器with ServerProxy(server_url) as proxy:response = proxy.file_input(file_name, filedata_b64)print(response)def get_file(name):save_path = os.path.join(os.getcwd(), name + ".zip")with ServerProxy(server_url) as proxy:file_content = proxy.file_output(name)if not isinstance(file_content, str):with open(save_path, 'wb') as file:file.write(file_content.data)print("ok")else:print(file_content)  # 如果返回的是错误消息if __name__ == '__main__':# 上传文件file_path = "文件路径"send_file(file_path)# 下载文件zip_prefix = "test"get_file(zip_prefix)

如果是第二种file_input写法,那么对应的上传这样写:

python">server = ServerProxy("http://IP:端口", allow_none=True)
put_handle = open("路径", 'rb')
server.file_input(xmlrpc.client.Binary(put_handle.read()))
put_handle.close()

注意:client端写文件时需要使用file.write(file_content.data),因为file_content不是byte。可以用type()打印一下,结果是:

<class 'xmlrpc.client.Binary'>

debug

对方服务器积极拒绝

检查:

  1. 能否ping通
    不过不通的话应该报错:
    TimeoutError: [WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
    
  2. 服务器端口是否开放
  3. 服务器程序是否正常运行
  4. server这句是不是写成localhost。应该写对外的IP
    python">server = ThreadXMLRPCServer(('IP', 端口), allow_none=True) # 初始化
    

最后再检查防火墙。不过一般前几个搞定就好了。


http://www.ppmy.cn/news/1531147.html

相关文章

简单梳理一下Python 数据分析与可视化

一、Python 数据分析与可视化的魅力 Python 在数据分析和可视化领域占据着重要地位。它具有广泛的应用场景&#xff0c;无论是商业分析、科学研究、社交媒体分析、金融分析还是医疗数据分析&#xff0c;都能发挥强大的作用。 在商业领域&#xff0c;Python 可以帮助商业分析师…

LLM安全风险及应对

LLM安全风险主要从四个维度分析&#xff1a;用户输入、训练数据、模型本身以及工具和插件。 风险类别具体风险风险解释应对措施具体举例用户输入相关风险提示注入&#xff08;Prompt Injection&#xff09;攻击者通过设计特定输入&#xff0c;使模型生成恶意或不安全的输出。- …

【自然语言处理】词嵌入模型

词嵌入&#xff08;Word Embedding&#xff09; 是一种将词汇表示为实数向量的技术&#xff0c;通常是低维度的连续向量。这些向量被设计为捕捉词汇之间的语义相似性&#xff0c;使得语义相似的词在嵌入空间中的距离也更近。词嵌入可以看作是将离散的语言符号&#xff08;如单词…

自动驾驶规划算法(一):A*算法原理和代码(c++与python)

1. A*算法简介 A*算法&#xff08;A-star algorithm&#xff09;诞生于1968年&#xff0c;由彼得哈特&#xff08;Peter Hart&#xff09;、尼尔森尼尔森&#xff08;Nils Nilsson&#xff09;和伯特拉波特&#xff08;Bertram Raphael&#xff09;三位计算机科学家提出。它的…

从成功案例中汲取数字化转型经验:企业数字化转型的实战指南

在全球经济数字化转型的浪潮中&#xff0c;许多企业已经成功地通过技术革新实现了业务的颠覆性改变。通过深入分析这些成功案例&#xff0c;可以为企业提供宝贵的经验教训&#xff0c;帮助他们在实施数字化转型时少走弯路。 本文将结合企业的真实案例&#xff0c;系统总结如何…

Java面试题之JVM20问

1、说说 JVM 内存区域 这张图就是一个 JVM 运行时数据图&#xff0c;「紫色区域代表是线程共享的区域」&#xff0c;JAVA 程序在运行的过程中会把他管理的内存划分为若干个不同的数据区域&#xff0c;「每一块儿的数据区域所负责的功能都是不同的&#xff0c;他们也有不同的创建…

基于单片机的宠物喂食(ESP8266、红外、电机)

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用L298N驱动连接P2.3和P2.4口进行电机驱动&#xff0c; 然后串口连接P3.0和P3.1模拟ESP8266&#xff0c; 红外传感器连接ADC0832数模转换器连接单片机的P1.0~P1.…

【Elasticsearch系列廿二】特殊参数

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…