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

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

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

try
{
    # 长度
    long t =100;
    # 创建内存块,test1,其他语言利用这个内存块名字就能找到内存块。
    var mmf = MemoryMappedFile.CreateOrOpen("test1", t, MemoryMappedFileAccess.ReadWrite);
    var viewAccessor = mmf.CreateViewAccessor(0, t);
    string s = "123";
    viewAccessor.Write(0, s.Length); ;
    viewAccessor.WriteArray<byte>(0, System.Text.Encoding.Default.GetBytes(s), 0, s.Length);
    // MessageBox.Show("write ok");
}
catch (System.Exception s)
{
    MessageBox.Show(s.Message);
}

Python从共享内存中读取

import mmap
str = '123'
byte = str.encode()
SHMEMSIZE = len(str)
file_name = 'test1'
print(SHMEMSIZE)
# python读取共享内存
shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)
print(shmem.read(SHMEMSIZE).decode('ASCII'))
shmem.close()

Python写入字符串到共享内存

import mmap
str = '123456'
byte = str.encode(encoding='UTF-8')
SHMEMSIZE = len(str)

file_name = 'global_share_memory'
print(file_name)

# python写入共享内存
shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_WRITE)
shmem.write(byte)

while True:
    pass

C#从共享内存中读取

long capacity = 6;
var mmf = MemoryMappedFile.OpenExisting("global_share_memory");
MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);
char[] charsInMMf = new char[6];
byte test = viewAccessor.ReadByte(0);
byte test2 = viewAccessor.ReadByte(1);
byte test3 = viewAccessor.ReadByte(2);
byte test4 = viewAccessor.ReadByte(3);

实例

import torch
from net.LinkNet import  linknet
import datetime
from 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)


# C# 传输图片

# python接受图片数据

# python输出结果
import mmap

strdd = '1'
byte = strdd.encode()
SHMEMSIZE = len(strdd)
file_name = 'CmdFlag'
print(SHMEMSIZE)

while True:
    # python读取共享内存
    shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_READ)
    cmdFlag = shmem.read(SHMEMSIZE).decode('ASCII')
    #print(cmdFlag)
    cmdFlag = str(cmdFlag)
    if(cmdFlag== "1"):
        print("classify")

        flag001 = '9'
        byte = flag001.encode(encoding='ASCII')
        SHMEMSIZE = len(flag001)
        file_name = 'CmdFlag'
        # python写入共享内存
        shmem = mmap.mmap(0, SHMEMSIZE, file_name, mmap.ACCESS_WRITE)
        shmem.write(byte)

    elif(cmdFlag == "2"):
        print("seg")
    elif(cmdFlag == "3"):
        print("dect")
    #shmem.close()

    # startTime = datetime.datetime.now()
    # # 这里调用你的方法
    # out = net(inputs)
    #
    # endTime = datetime.datetime.now()
    # strTime = 'funtion time use:%dms' % (
    #             (endTime - startTime).seconds * 1000 + (endTime - startTime).microseconds / 1000)
    # print(strTime)



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<byte>(0, System.Text.Encoding.Default.GetBytes(cmd), 0, cmd.Length);
}
// 调用算法

Bitmap b = new Bitmap("test.bmp");
MemoryStream ms = new MemoryStream();
b.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] bytes = ms.GetBuffer();  //byte[]   bytes=   ms.ToArray(); 
ms.Close();
var mmf = MemoryMappedFile.CreateOrOpen("test1", bytes.Length, MemoryMappedFileAccess.ReadWrite);
var viewAccessor = mmf.CreateViewAccessor(0, bytes.Length);
viewAccessor.Write(0, bytes.Length); ;
viewAccessor.WriteArray<byte>(0, bytes, 0, bytes.Length);

test4w("1");

MessageBox.Show("write ok! ImageSize:" + bytes.Length.ToString());
 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<char>(4, charsInMMf, 0, strLength);
 MessageBox.Show(new string(charsInMMf));
public void MMF4Write(string blockName ,string content)
{

   try
   {
       long t = 1 << 10 << 10;
       var mmf = MemoryMappedFile.CreateOrOpen(blockName, t, MemoryMappedFileAccess.ReadWrite);
       var viewAccessor = mmf.CreateViewAccessor(0, t);
       viewAccessor.Write(0, content.Length);
       viewAccessor.WriteArray<char>(4, content.ToArray(), 0, content.Length);
   }
   catch (System.Exception s)
   {
       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] {1,2};

      // viewAccessor2.ReadArray<byte>(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, MemoryMappedFileAccess.ReadWrite);
        var viewAccessor = mmf.CreateViewAccessor(0, imgBytes.Length);
        viewAccessor.Write(0, imgBytes.Length); ;
        viewAccessor.WriteArray<byte>(0, imgBytes, 0, imgBytes.Length);

    }
    catch (System.Exception s)
    {
        MessageBox.Show("写入图像失败!");
        MessageBox.Show(s.Message);
    }

}

实例

import torch
import cv2
from net.LinkNet import  linknet
import numpy as np
import matplotlib.pyplot as plt
from 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)


import mmap

shmem = mmap.mmap(0, 2, "Result_Test", mmap.ACCESS_WRITE)
shmem.write("ma".encode(encoding='ASCII'))

while True:
    '''
      1.检测调用算法Flag
    '''
    # python读取共享内存

    shmem = mmap.mmap(0, 1, 'AlgorithmFlag', mmap.ACCESS_READ)
    AlgorithmFlag = shmem.read(1).decode('ASCII')
    # print(AlgorithmFlag)
    #print(cmdFlag)
    AlgorithmFlag = str(AlgorithmFlag)
    if(AlgorithmFlag== "1"):
        '''
          2.1 读取图像数据        
        '''

        startTime = datetime.now()
        f = mmap.mmap(0, 1921078, "img1", mmap.ACCESS_READ)
        # print(f.read(byteSize))
        img = cv2.imdecode(np.frombuffer(f, np.uint8), cv2.IMREAD_COLOR)
        # plt.imshow(img)
        # plt.show()
        '''
          2.2 算法处理     
        '''
        out = net(inputs)

        '''
          2.4 写入算法结果到物理内存块
        '''
        res = 'OK,0.02'
        shmem2 = mmap.mmap(0, len(res), "Result_Test", mmap.ACCESS_WRITE)
        shmem2.write(res.encode(encoding='ASCII'))
        print("算法结果已写入")

        '''
          2.x 设置算法结束Flag
        '''
        # python写入共享内存
        shmem = mmap.mmap(0, 1, "AlgorithmFlag", mmap.ACCESS_WRITE)
        shmem.write('5'.encode(encoding='ASCII'))

        '''
           计算耗时
        '''
        endTime = datetime.now()
        strTime = 'funtion time use:%dms' % (
                    (endTime - startTime).seconds * 1000 + (endTime - startTime).microseconds / 1000)
        print(strTime)

        # shmem = mmap.mmap(0, 1, "A1_FinishFlag", mmap.ACCESS_WRITE)
        # shmem.write('-1'.encode(encoding='ASCII'))



    # startTime = datetime.datetime.now()
    # # 这里调用你的方法
    # out = net(inputs)
    #
    # endTime = datetime.datetime.now()
    # strTime = 'funtion time use:%dms' % (
    #             (endTime - startTime).seconds * 1000 + (endTime - startTime).microseconds / 1000)
    # print(strTime)


// 1.读取图像
byte[] bytes = Bitmap2bytes("test.bmp");
// 3.图像写入内存块
MMF4WriteImage("img1", bytes);
// 4.写入,结束flag
MMF4Write("AlgorithmFlag", "1");
// 5.等待python处理结束flag
while(true)
{
    //long capacity = 6;
    //var mmf2 = MemoryMappedFile.OpenExisting("AlgorithmFlag");
    //MemoryMappedViewAccessor viewAccessor2 = mmf2.CreateViewAccessor(0, capacity);
    //byte AlgorithmFlag = viewAccessor.ReadByte(0);
    //AddLog(0, client + ": " + AlgorithmFlag.ToString());
    
    string res = MMF4Read("AlgorithmFlag", 1);
    if (res == "5")
    {
        string res2 = MMF4Read("Result_Test", 7);
        MessageBox.Show(res2);
        break;
    }
    Thread.Sleep(1);

}

        public void MMF4Write(string blockName ,string content)
        {

            try
            {
                
                var mmf = MemoryMappedFile.CreateOrOpen(blockName,999, MemoryMappedFileAccess.ReadWrite);
                byte[] byteArray = System.Text.Encoding.ASCII.GetBytes(content);
                var viewAccessor = mmf.CreateViewAccessor(0, byteArray.Length);
                
                viewAccessor.WriteArray<byte>(0, byteArray, 0, byteArray.Length);
            }
            catch (System.Exception s)
            {
                MessageBox.Show("写入失败!");
                MessageBox.Show(s.Message);
            }

        }

        public string MMF4Read(string blockName,int contentLength)
        {

            try
            {
                long capacity = 666;
                var mmf = MemoryMappedFile.OpenExisting(blockName);
                MemoryMappedViewAccessor viewAccessor = mmf.CreateViewAccessor(0, capacity);
                byte[] bytes = new byte[contentLength];
                viewAccessor.ReadArray<byte>(0, bytes, 0, bytes.Length);
                string msg = Encoding.ASCII.GetString(bytes);
                //mmf.Dispose();
                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<byte>(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);
            // 2.转为bytes
            byte[] bytes = ms.GetBuffer();  //byte[]   bytes=   ms.ToArray(); 
            
            ms.Close();
            return bytes;
        }
  • 10
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值