需要在VM的C#脚本设置string类型Out变量和float类型OutF变量,python的输出信息会在Out变量显示

using System;
using System.IO;
using Script.Methods;
using System.Diagnostics;
using System.Net.Sockets;
using System.Text;
using System.Threading;public partial class UserScript : ScriptMethods, IProcessMethods
{private PythonTcpRunner _pythonRunner;private Process _pythonProcess; // 保持进程引用public new int nErrorCode;private string pythonEdio=@"C:\T\python.exe";private string python= @"C:\T\清晰度评估.py";/// <summary>/// 初始化:启动Python进程并建立TCP连接/// </summary>public void Init(){// 初始化TCP运行器(使用本地8888端口)_pythonRunner = new PythonTcpRunner(pythonEdio,python,"127.0.0.1",8888);// 启动Python进程并等待TCP服务就绪string errorMsg;if (!_pythonRunner.StartProcess(out _pythonProcess, out errorMsg)){nErrorCode = -1;Out = "初始化Python进程失败: " + errorMsg;}}/// <summary>/// 执行流程:通过TCP发送请求/// </summary>public bool Process(){try{// 检查进程状态if (_pythonProcess == null || _pythonProcess.HasExited){string errorMsg;if (!_pythonRunner.RestartProcess(out _pythonProcess, out errorMsg)){nErrorCode = -1;Out = "重启Python进程失败: " + errorMsg;return false;}}// 通过TCP发送执行请求string errorMessage;string outputMessage;bool success = _pythonRunner.SendRequest("EXECUTE", out errorMessage, out outputMessage, 5000);Out = string.IsNullOrWhiteSpace(outputMessage) ? errorMessage : outputMessage;// 尝试将输出转换为float并赋值给OutFfloat result;if (!float.TryParse(outputMessage, out result)){// 如果转换失败,设置为NaN或其他默认值OutF = float.NaN;}else{OutF = result;}if (!success){nErrorCode = -2;return false;}nErrorCode = 0;return true;}catch (Exception ex){nErrorCode = -3;Out = string.Format("执行异常: {0}", ex.Message);return false;}}/// <summary>/// 释放资源:关闭进程和连接,使用override关键字重写基类方法/// </summary>public override void Dispose(){// 发送退出指令(修复输出参数错误,兼容.NET 4.6)if (_pythonRunner != null){string dummyError;string dummyOutput;_pythonRunner.SendRequest("EXIT", out dummyError, out dummyOutput, 1000);}if (_pythonProcess != null && !_pythonProcess.HasExited){try{_pythonProcess.WaitForExit(2000);if (!_pythonProcess.HasExited)_pythonProcess.Kill();}catch { }finally{_pythonProcess.Dispose();_pythonProcess = null;}}// 关闭连接(兼容.NET 4.6)if (_pythonRunner != null){_pythonRunner.Close();}// 调用基类的Dispose方法base.Dispose();}
}/// <summary>
/// 基于TCP的Python运行器
/// </summary>
public class PythonTcpRunner
{private string _pythonPath;private string _scriptPath;private string _ip;private int _port;private TcpClient _client;public PythonTcpRunner(string pythonPath, string scriptPath, string ip, int port){_pythonPath = pythonPath;_scriptPath = scriptPath;_ip = ip;_port = port;}/// <summary>/// 启动Python进程/// </summary>public bool StartProcess(out Process process, out string errorMessage){errorMessage = string.Empty;process = null;try{var startInfo = new ProcessStartInfo{FileName = _pythonPath,Arguments = string.Format("\"{0}\" {1} {2}", _scriptPath, _ip, _port),UseShellExecute = false,CreateNoWindow = true,WorkingDirectory = Path.GetDirectoryName(_scriptPath)};process = Process.Start(startInfo);if (process == null){errorMessage = "无法启动Python进程";return false;}// 等待TCP服务启动(最多等3秒)int retry = 0;while (retry < 30){try{_client = new TcpClient();var result = _client.BeginConnect(_ip, _port, null, null);var success = result.AsyncWaitHandle.WaitOne(100);if (success){_client.EndConnect(result);return true;}}catch { }retry++;Thread.Sleep(100);}errorMessage = "Python TCP服务启动超时";process.Kill();return false;}catch (Exception ex){errorMessage = ex.Message;return false;}}/// <summary>/// 重启进程/// </summary>public bool RestartProcess(out Process process, out string errorMessage){Close();return StartProcess(out process, out errorMessage);}/// <summary>/// 发送TCP请求/// </summary>public bool SendRequest(string command, out string errorMessage, out string outputMessage, int timeout){errorMessage = string.Empty;outputMessage = string.Empty;try{if (_client == null || !_client.Connected){errorMessage = "TCP连接已断开";return false;}var stream = _client.GetStream();stream.ReadTimeout = timeout;stream.WriteTimeout = timeout;// 发送指令(UTF8编码,以换行符结束)byte[] data = Encoding.UTF8.GetBytes(command + "\n");stream.Write(data, 0, data.Length);// 读取响应(直到收到结束标记)using (var ms = new MemoryStream()){byte[] buffer = new byte[1024];int bytesRead;while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0){ms.Write(buffer, 0, bytesRead);// 检查是否包含结束标记string temp = Encoding.UTF8.GetString(ms.ToArray());if (temp.Contains("\nEOF\n")){outputMessage = temp.Replace("\nEOF\n", "").Trim();return true;}}}errorMessage = "未收到完整响应";return false;}catch (Exception ex){errorMessage = ex.Message;return false;}}/// <summary>/// 关闭连接/// </summary>public void Close(){try{if (_client != null){_client.Close();}}catch { }_client = null;}
}
import sys
import time
import socket# 简单的数字运算函数
def simple_calculation(input_num):result = (input_num ** 2) + (input_num * 1.5) - 42time.sleep(0.1)return round(result, 2)# 简化的TCP服务器
class SimpleServer:def __init__(self, host, port):self.host = hostself.port = portself.server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)self.server_socket.bind((host, port))self.server_socket.listen(1)self.running = Trueself.client_socket = Noneself.test_numbers = [12, 34, 56, 78, 90]def handle_client(self):while self.running and self.client_socket:try:data = self.client_socket.recv(1024).decode('utf-8').strip()if not data:breakif data == "EXECUTE":result = self.process_numbers()self.client_socket.sendall((result + "\nEOF\n").encode('utf-8'))elif data == "EXIT":self.running = Falseself.client_socket.sendall("已退出\nEOF\n".encode('utf-8'))breakelse:self.client_socket.sendall(("未知指令\nEOF\n").encode('utf-8'))except Exception as e:error_msg = f"处理请求出错: {str(e)}\nEOF\n"self.client_socket.sendall(error_msg.encode('utf-8'))breakdef process_numbers(self):total_start = time.perf_counter()results = []for num in self.test_numbers:try:result = simple_calculation(num)results.append(f"数字 {num} 的计算结果: {result}")except Exception as e:results.append(f"错误: {str(e)}")total_elapsed = time.perf_counter() - total_startresults.append(f"\n总处理时间: {total_elapsed:.4f}秒")return "\n".join(results)def start(self):print(f"TCP服务器启动在 {self.host}:{self.port}")try:self.client_socket, addr = self.server_socket.accept()print(f"客户端 {addr} 已连接")self.handle_client()finally:self.stop()def stop(self):if self.client_socket:self.client_socket.close()self.server_socket.close()print("服务器已停止")if __name__ == "__main__":if len(sys.argv) != 3:print("用法: python simple_server.py [host] [port]")sys.exit(1)host = sys.argv[1]port = int(sys.argv[2])server = SimpleServer(host, port)try:server.start()except KeyboardInterrupt:server.stop()sys.exit(0)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93564.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93564.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93564.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运维工作架构流程搭建

前言 在解决了运维是干什么的&#xff0c;运维的工作的意义后&#xff0c;这一章我们系统性的讲讲运维工作流程搭建&#xff0c;希望大家能通过我的分享有所收获&#xff0c;这一章干货满满。 一、网络服务器架构 按照一般的访问方式&#xff0c;按照我自己的理解画了一个网络服…

安全存储之 SAES+HUK 使用技巧和常见问题 LAT1543

关键字&#xff1a;AES&#xff0c;SAES, HUK, DHUK, 安全存储 引言 近年来&#xff0c;嵌入式设备信息安全被越来越多地提及&#xff0c;从智能穿戴产品、智能工业设备到物联网产品都对设备信息安全提出了要求&#xff0c;比如基础的安全启动&#xff0c;安全升级&#xff0…

ubuntu 20.04 搭建多用户远程桌面共享及同时在线使用

使用效果: 物理机: 远程桌面用户: 实现过程: 1.使用脚本安装xrdp并修改配置及启动服务 setup_xrdp.sh sudo apt update sudo apt install xrdp -ysudo systemctl enable xrdp sudo systemctl start xrdp#sudo vim /etc/xrdp/startwm.sh #unset DBUS_SESSION_BUS_ADDRES…

[激光原理与应用-287]:理论 - 波动光学 - 电磁波既能承载能量,又能承载信息?

电磁波既能承载能量&#xff0c;又能承载信息&#xff0c;这一特性源于其物理本质和调制技术的结合。以下从能量承载和信息承载两方面进行详细解析&#xff1a;一、电磁波如何承载能量&#xff1f;电磁波的能量承载源于其电场和磁场的周期性振荡&#xff0c;具体机制如下&#…

哪里找最新AI工具官网?如何快速对比ChatGPT替代品?AI工具导航指南 - AIbase

你是否曾有这样的经历&#xff1a; 听闻某款新AI工具爆火&#xff0c;翻遍网络却找不到可靠官网或真实评测&#xff1f; 面对功能相似的ChatGPT替代品&#xff0c;参数对比表格散落各处&#xff0c;决策耗时耗力&#xff1f; 想紧跟AI领域突破&#xff0c;却淹没在海量资讯碎…

第一阶段C#基础-15:面向对象梳理

面向对象对象三&#xff08;四&#xff09;大特征&#xff1a;封装&#xff0c;继承&#xff0c;多态&#xff0c;&#xff08;抽象&#xff09;1_封装&#xff08;1&#xff09;封装是指将数据&#xff08;属性&#xff09;和行为&#xff08;方法&#xff09;组合在一个类中&…

中国星网发展情况全面分析

中国星网作为我国卫星互联网领域的"国家队"先锋,自2021年4月成立以来已取得显著进展。截至2025年8月,中国星网主导的GW星座已累计发射73颗卫星,形成"四天两发"的高频发射节奏,标志着我国低轨卫星互联网建设进入加速期。在战略定位上,中国星网不仅承担…

C++ Qt 成员对象初始化与 TCP 长连接问题深度解析

文章目录C Qt 成员对象初始化与 TCP 长连接问题深度解析1. 栈对象、堆对象与类成员对象的区别1.1 栈对象&#xff08;局部变量&#xff09;1.2 堆对象&#xff08;动态分配&#xff09;1.3 类成员对象1.4 栈对象 vs 成员对象 vs 堆对象对比表2. 为什么初始化列表必须用2.1 构造…

深度学习周报(8.11~8.17)

目录 摘要 Abstract 1 CNN--卷积神经网络简介 2 CNN核心操作 2.1 卷积 2.2 池化 3 总结 摘要 本周主要学习了卷积神经网络&#xff08;CNN&#xff09;的相关知识&#xff0c;包括概念、基本架构与应用领域等知识&#xff0c;了解了CNN利用其结构高效地从图像等网格化数…

oracle dg duplicate限速

一些客户在搭建dg的时候需要进行限速&#xff0c;不然对生产库的影响比较大&#xff0c;例如将速度限制到200M每秒&#xff0c;语法如下&#xff1a;rman target sys/XXXX auxiliary sys/XXXXdg <<EOF run{ allocate channel d1 type disk rate 200M; allocate auxiliar…

飞算JavaAI智慧校园场景实践:从校园管理到师生服务的全链路技术革新

目录一、智慧校园核心场景的技术突破1.1 智能校园综合管理系统1.2 智慧教学资源共享系统1.3 校园生活服务集成系统二、智慧校园系统效能升级实践结语&#xff1a;重新定义智慧校园技术边界在校园管理领域&#xff0c;“规模化运营”与“个性化服务”的矛盾、“管理效率”与“服…

PTPX分析中,如何处理fsdb文件过大的问题?

PTPX分析中&#xff0c;如何处理fsdb文件过大的问题&#xff1f;摘要&#xff1a;下面将基于Synopsys工具链&#xff08;PrimeTime PX&#xff0c;即PTPX&#xff0c;用于功耗分析&#xff1b;Verdi&#xff0c;用于波形查看&#xff09;逐一解答每个部分。这些工具在SoC功耗验…

004.Redis 数据持久化概述及实战

文章目录Redis持久化说明Redis持久化RDB持久化AOF持久化混合持久化save与bgsaveRedis RDB持久化Redis 安装Redis RDB配置手动触发RDB持久化模拟写入测试数据模拟进程异常RDB的优缺点优势劣势Redis AOF持久化Redis 安装Redis AOF配置AOF持久化模拟写入测试数据模拟进程异常AOF的…

Kubernetes(K8s)常用命令全解析:从基础到进阶

Kubernetes&#xff08;K8s&#xff09;常用命令全解析&#xff1a;从基础到进阶 引言&#xff1a;为什么掌握K8s命令是云原生时代的必备技能&#xff1f; Kubernetes&#xff08;简称K8s&#xff09;作为容器编排的事实标准&#xff0c;已成为云原生应用部署、扩展和管理的核…

深入解析StatefulSet与K8s服务管理

目录 一、Statefulset控制器&#xff1a;概念、原理解读 有状态服务 无状态服务 StatefulSet部分组成 Headless service 二、Statefulset资源清单文件编写技巧 三、Statefulset使用案例&#xff1a;部署web站点 四、Statefulset管理pod&#xff1a;扩容、缩容、更新 St…

GaussDB常用术语缩写及释义

序号 术语全称释义1ACLAccess Control List访问控制列表&#xff0c;被授权访问某一资源的实体及其访问权限的列表。2APIApplication Programming Interface应用程序接口&#xff0c;一些预先定义的接口&#xff08;如函数&#xff0c;http接口&#xff09;或指软件系统不同组…

工业一体机5G通讯IC/ID刷卡让MES系统管理更智能

在智能制造升级过程中&#xff0c;MES 系统作为生产执行的核心枢纽&#xff0c;其数据采集的实时性、准确性与管理安全性直接决定管理效能。传统 MES 系统常面临数据传输滞后、设备对接繁琐、权限管理粗放等问题&#xff0c;而工业一体机凭借 5G 通讯与 IC/ID 刷卡功能&#xf…

电脑开机几秒后就停止然后再循环是怎么回事

硬件问题电源问题&#xff1a;电源内部的滤波电容若出现鼓包或漏液现象&#xff0c;会导致电源供电不足&#xff0c;从而使电脑开机后自动停止并重新启动。另外&#xff0c;电源线连接不良、插座无电或电源供应器故障&#xff0c;也可能引发此问题。CPU 散热问题&#xff1a;如…

OSCP - Proving Grounds - Vanity

主要知识点Linux命令注入rsync 脚本劫持(以前tar 备份脚本劫持也是利用了类似的方法&#xff09;具体步骤nmap扫描结果&#xff0c;发现web服务开放&#xff0c;并且 rsync服务开放&#xff0c;值得研究一下Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-10-30 14:37 UT…

详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。

1. 引言&#xff1a;AI技术概述及其在各行业的重要性人工智能(AI)技术近年来取得了突破性进展&#xff0c;从理论研究走向了广泛的商业应用。AI的核心技术包括机器学习、深度学习、自然语言处理、计算机视觉等&#xff0c;这些技术正在深刻改变各行各业的运营模式和服务方式。在…