博客
关于我
Python与C#之间内存共享互传信息
阅读量:799 次
发布时间:2023-03-09

本文共 8112 字,大约阅读时间需要 27 分钟。

Python与CSharp之间内存共享互传信息

一、C#写入字符串到共享内存

尝试以下代码:

long t = 100; // 内存块的大小var mmf = MemoryMappedFile.CreateOrOpen("test1", t, MemoryMappedFileAccess.ReadWrite); // 创建或打开内存映射文件var viewAccessor = mmf.CreateViewAccessor(0, t); // 创建内存视图访问器string s = "123";viewAccessor.Write(0, s.Length); // 写入长度viewAccessor.WriteArray
(0, System.Text.Encoding.Default.GetBytes(s), 0, s.Length); // 写入字符串

如果出现错误会显示错误信息。

二、Python从共享内存中读取

以下代码用于读取C#写入的字符串:

import mmapstr = '123'SHMEMSIZE = len(str)file_name = 'test1'print(SHMEMSIZE)  # 输出内存块的大小# 读取共享内存shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)print(shmem.read(SHMEMSIZE).decode('ASCII'))  # 解码并输出字符串shmem.close()  # 关闭内存映射

实例

以下是一个完整的示例:

import torchfrom net.LinkNet import linknetimport numpy as npimport cv2# 创建输入数据inputs = torch.randn((1, 3, 512, 512))# 定义网络net = linknet(n_classes=8)# 前向传播out = net(inputs)# 输出大小print('-----' * 5)print(out.size())print('-----' * 5)# Python接受图片数据并写入共享内存import mmapstrdd = '1'byte = strdd.encode()SHMEMSIZE = len(strdd)file_name = 'CmdFlag'print(SHMEMSIZE)while True:    # 读取共享内存    shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)    cmdFlag = shmem.read(SHMEMSIZE).decode('ASCII')    cmdFlag = str(cmdFlag)        if cmdFlag == "1":        print("classify")        flag001 = '9'        byte = flag001.encode(encoding='ASCII')        SHMEMSIZE = len(flag001)        file_name = 'CmdFlag'        # 写入共享内存        shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_WRITE)        shmem.write(byte)    elif cmdFlag == "2":        print("seg")    elif cmdFlag == "3":        print("dect")

C#读取共享内存中的字符串

以下代码用于读取Python写入的字符串:

long capacity = 100;var mmf = MemoryMappedFile.OpenExisting("CmdFlag"); // 打开已存在的内存映射文件MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);char[] charsInMMf = new char[capacity]; // 初始化字符数组viewAccessor.ReadArray
(0, charsInMMf, 0, capacity); // 读取字符数组string msg = new string(charsInMMf); // 将字符数组转换为字符串MessageBox.Show(msg); // 显示结果

实现功能扩展

以下代码扩展了内存映射的功能:

public void MMF4Write(string blockName, string content){    try    {        long t = 1 << 10; // 计算内存块的大小        var mmf = MemoryMappedFile.CreateOrOpen(blockName, t, MemoryMappedFileAccess.ReadWrite);        var viewAccessor = mmf.CreateViewAccessor(0, t);        viewAccessor.Write(0, content.Length); // 写入长度        viewAccessor.WriteArray
(4, content.ToArray(), 0, content.Length); // 写入内容 } catch (System.Exception s) { MessageBox.Show("写入失败!"); MessageBox.Show(s.Message); }}public string MMF4Read(string blockName){ try { long capacity = 2; var mmf2 = MemoryMappedFile.OpenExisting(blockName); MemoryMappedViewAccessor viewAccessor2 = mmf2.CreateViewAccessor(0, capacity); byte[] charsInMMf = new byte[2] { (byte)1, (byte)2 }; viewAccessor2.ReadArray
(0, charsInMMf, 0, 2); charsInMMf[0] = viewAccessor2.ReadByte(0); charsInMMf[1] = viewAccessor2.ReadByte(1); string msg = Encoding.UTF8.GetString(charsInMMf); return msg; } catch (System.Exception s) { MessageBox.Show(s.Message); return "fail"; }}public void MMF4WriteImage(string blockName, byte[] imgBytes){ try { var mmf = MemoryMappedFile.CreateOrOpen("img1", imgBytes.Length + 1000, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, imgBytes.Length); viewAccessor.WriteArray
(0, imgBytes, 0, imgBytes.Length); } catch (System.Exception s) { MessageBox.Show("写入图像失败!"); MessageBox.Show(s.Message); }}public byte[] Bitmap2bytes(string imgPath){ Bitmap b = new Bitmap(imgPath); MemoryStream ms = new MemoryStream(); b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); byte[] bytes = ms.GetBuffer(); ms.Close(); return bytes;}

实例应用

以下是一个完整的实例:

import torchimport cv2from net.LinkNet import linknetimport numpy as npimport matplotlib.pyplot as pltfrom datetime import datetime# 创建输入数据inputs = torch.randn((1, 3, 512, 512))# 定义网络net = linknet(n_classes=8)# 前向传播out = net(inputs)# 打印输出大小print('-----' * 5)print(out.size())print('-----' * 5)# Python接受图片数据并写入共享内存import mmapshmem = mmap.mmap(0, 2, "Result_Test", mmap.ACCESS_WRITE)shmem.write("ma".encode(encoding='ASCII'))while True:    # 读取共享内存中的标志    shmem_flag = mmap.mmap(0, 1, 'AlgorithmFlag', mmap.ACCESS_READ)    AlgorithmFlag = shmem_flag.read(1).decode('ASCII')    AlgorithmFlag = str(AlgorithmFlag)        if AlgorithmFlag == "1":        # 读取图像数据        img_map = mmap.mmap(0, 1921078, "img1", mmap.ACCESS_READ)        img = cv2.imdecode(np.frombuffer(img_map, np.uint8), cv2.IMREAD_COLOR)                # 算法处理        out = net(inputs)                # 写入算法结果到共享内存        result_map = mmap.mmap(0, len("OK,0.02"), "Result_Test", mmap.ACCESS_WRITE)        result_map.write("OK,0.02".encode(encoding='ASCII'))        print("算法结果已写入")                # 设置算法结束标志        end_flag_map = mmap.mmap(0, 1, "A1_FinishFlag", mmap.ACCESS_WRITE)        end_flag_map.write('-1'.encode(encoding='ASCII'))                # 计算耗时        startTime = datetime.now()        endTime = datetime.now()        strTime = '函数时间用时:%dms' % (            (endTime - startTime).seconds * 1000 + (endTime - startTime).microseconds / 1000        )        print(strTime)    elif AlgorithmFlag == "2":        print("Segmentation")    elif AlgorithmFlag == "3":        print("Decomposition")

C#调用Python算法并处理结果

以下代码用于在C#中调用Python算法:

public void test4w(string cmd){    long t = 100;    var mmf = MemoryMappedFile.CreateOrOpen("CmdFlag", t, MemoryMappedFileAccess.ReadWrite);    var viewAccessor = mmf.CreateViewAccessor(0, t);    viewAccessor.Write(0, cmd.Length);    viewAccessor.WriteArray
(0, System.Text.Encoding.Default.GetBytes(cmd), 0, cmd.Length);}public void MMF4Write(string blockName, string content){ try { long t = 1 << 10; var mmf = MemoryMappedFile.CreateOrOpen(blockName, t, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, t); viewAccessor.Write(0, content.Length); viewAccessor.WriteArray
(4, content.ToArray(), 0, content.Length); } catch (System.Exception s) { MessageBox.Show("写入失败!"); MessageBox.Show(s.Message); }}public string MMF4Read(string blockName){ try { long capacity = 2; var mmf2 = MemoryMappedFile.OpenExisting(blockName); MemoryMappedViewAccessor viewAccessor2 = mmf2.CreateViewAccessor(0, capacity); byte[] bytes = new byte[2] { (byte)1, (byte)2 }; viewAccessor2.ReadArray
(0, bytes, 0, 2); bytes[0] = viewAccessor2.ReadByte(0); bytes[1] = viewAccessor2.ReadByte(1); string msg = Encoding.UTF8.GetString(bytes); return msg; } catch (System.Exception s) { MessageBox.Show(s.Message); return "fail"; }}public void MMF4WriteImage(string blockName, byte[] imgBytes){ try { var mmf = MemoryMappedFile.CreateOrOpen("img1", imgBytes.Length + 1000, MemoryMappedFileAccess.ReadWrite); var viewAccessor = mmf.CreateViewAccessor(0, imgBytes.Length); viewAccessor.WriteArray
(0, imgBytes, 0, imgBytes.Length); } catch (System.Exception s) { MessageBox.Show("写入图像失败!"); MessageBox.Show(s.Message); }}public byte[] Bitmap2bytes(string imgPath){ Bitmap b = new Bitmap(imgPath); MemoryStream ms = new MemoryStream(); b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); byte[] bytes = ms.GetBuffer(); ms.Close(); return bytes;}

图像传输与处理

以下代码实现了图像传输与处理:

long capacity = 666;var mmf = MemoryMappedFile.OpenExisting("Result");MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);int strLength = viewAccessor.ReadInt32(0);char[] charsInMMf = new char[strLength];viewAccessor.ReadArray
(4, charsInMMf, 0, strLength);MessageBox.Show(new string(charsInMMf));

总结

通过上述方法,我们成功实现了Python与C#之间的内存共享与数据互传。C#可以写入字符串到共享内存,Python可以从共享内存中读取字符串。同时,Python也可以写入字符串到共享内存,C#可以读取字符串。通过这些方法,我们可以实现高效的数据交互和内存管理。

转载地址:http://fnlfk.baihongyu.com/

你可能感兴趣的文章
Python基础(2):控制结构
查看>>
Python基础 | 关于“循环”那些事
查看>>
python系列【仅供参考】:python 远程rdp
查看>>
python基于flask搭建http服务(四)—— Docker容器化部署
查看>>
Python块键盘/鼠标输入
查看>>
python在使用HTMLTestRunner时,报告为空,错误提示<_io.TextIOWrapper name='<stderr>' mode='w' encoding='utf_8'>...
查看>>
python在gpu上运行_【python】python开启GPU加速
查看>>
Python在def函数中使用for循环
查看>>
Python在def函数中使用for循环
查看>>
Python在Conda环境中,但在Windows虚拟环境中没有激活
查看>>
python系列【仅供参考】:python pip 错误 ModuleNotFoundError: No module named pip._internal 解决办法
查看>>
python图像条状状噪声,使用PYTHON PIL从验证码图像中删除背景嘈杂的线条
查看>>
Python图像处理:从内存加载jpeg
查看>>
python固定后缀(名物化词汇)词频统计:抽取+统计+可视化
查看>>
python商品评论数据采集与分析可视化系统 Flask框架 requests爬虫 NLP情感分析 毕业设计 源码
查看>>
python商品数据分析可视化系统(带爬虫)京东销售数据分析 计算机毕业设计 源码下载
查看>>
python商品库存管理系统 django框架 商品网站 MySQL数据库 源码下载 计算机毕业设计
查看>>
Python哪个版本最稳定好用2023.10.19
查看>>
Python和黑客技术的渊源
查看>>
Python和RF编写接口自动化
查看>>