博客
关于我
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办公自动化基础输出文件和文件夹
查看>>
python办公自动化基础搜索文件
查看>>
python前端之css
查看>>
Python制作进度条,原来有这么多方法
查看>>
Python制作简单的学生成绩管理系统
查看>>
python制作甘特图的基本知识(附Demo)
查看>>
python制作一个简单的服务器,【Python】 做一个简单的 http 服务器
查看>>
Python到底能做什么?它的优点在哪?
查看>>
python利用pytorch库导出图像分割算子
查看>>
python利用pyshark监听网卡来抓包其中pyshark中摸索的一些可用参数
查看>>
python利用excel分析过杀漏失
查看>>
python判断汉字数目
查看>>
python判断文件是空的,如果是空的,就删除
查看>>
python判断密码是否正确_python密码判断是否符合要求的方法
查看>>
python判断字符串包含中文_Python 判断字符串是否包含中文
查看>>
python删除第一行_Python 乱码指北:一行删掉根目录
查看>>
Python删除列表元素的三种方法
查看>>
python初步学习-python数据类型-集合(set)
查看>>
python列表生成字典_Python中将字典转换为列表的方法
查看>>
python列表对应元素合并为列表及判断一个列表是几维
查看>>