博客
关于我
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/

你可能感兴趣的文章
python3.6 ubuntu部署nginx、 uwsgi、 django
查看>>
Python3.6.3中,functools似乎不能用
查看>>
python3.6.5+cuda9+cudnn7.1+win10+tensorflow-gpu1.9.0下载配置
查看>>
python3.6使用pickle序列化class
查看>>
python3.6入门到高阶(全栈) day027 网络通信协议 osi七层模型
查看>>
Python3.6属性错误:模块‘;异步没有属性‘;运行‘;
查看>>
python3.6版本中的python-weka-wrapper安装失败,错误代码为%1
查看>>
Python3.7安装cv2踩过的坑
查看>>
python写txt文件
查看>>
python关于sorted排序函数详细解析 附实战代码(全)
查看>>
python3.8调用m文件,调用matlab
查看>>
python3.9新特性_Python 3.9 新特性速览
查看>>
Python3.x:遍历select下拉框获取value值
查看>>
python360百科_11月编程排行榜:Python超过Java成第二
查看>>
Python关于Paginator分页函数详细解析 附实战代码
查看>>
python3、ipython3、setup-tools、pip等环境搭建详细总结
查看>>
python3下使用cv2.imwrite存储带有中文路径图片或者绝对路径图片
查看>>
python3与django中@property详解
查看>>
python3中如何表示无穷大
查看>>
Python3中提示:no module named 'wxpy'
查看>>