python - 将数据从 python 传输到 Windows 中的另一个应用程序的最佳方法是什么?

标签 python winapi com data-transfer

我正在与一个团队在 .Net (C++) 中开发一个应用程序,并提供一个 COM 接口(interface)来与 python 和其他语言进行交互。

我们发现通过 COM 推送数据的速度非常慢。

我考虑过几种选择:

  • 转储数据到文件,并通过com发送文件路径
  • 通过 mmap 共享内存?
  • 直接通过套接字流式传输数据?

根据您的经验,传递数据的最佳方式是什么?

最佳答案

在 Windows 进程间通信机制中,我们在使用 windows 命名管道 方面有积极的经验。 使用 Windows 重叠 IO 和来自 pywin32win32pipe 模块.

您可以在 Python Programming On Win32 中了解更多有关 win32 和 python 的信息书。

发送部分简单地写入r'\\.\pipe\mypipe'

监听器 (ovpipe) 对象持有一个事件句柄,等待消息和可能的其他事件涉及调用 win32event.WaitForMultipleObjects

rc = win32event.WaitForMultipleObjects(
    eventlist,    # Objects to wait for.
    0,            # Wait for one object
    timeout)      # timeout in milli-seconds.

这是 python 重叠监听器类的一部分:

import win32event
import pywintypes
import win32file
import win32pipe

class ovpipe:
"Overlapped I/O named pipe class"
def __init__(self):
    self.over=pywintypes.OVERLAPPED()
    evt=win32event.CreateEvent(None,1,0,None)
    self.over.hEvent=evt
    self.pname='mypipe'
    self.hpipe = win32pipe.CreateNamedPipe(
        r'\\.\pipe\mypipe',             # pipe name 
        win32pipe.PIPE_ACCESS_DUPLEX|   # read/write access
        win32file.FILE_FLAG_OVERLAPPED,
        win32pipe.PIPE_TYPE_MESSAGE|    # message-type pipe 
        win32pipe.PIPE_WAIT,            # blocking mode 
        1,                              # number of instances 
        512,                            # output buffer size 
        512,                            # input buffer size 
        2000,                           # client time-out
        None)                           # no security attributes
    self.buffer = win32file.AllocateReadBuffer(512)
    self.state='noconnected'
    self.chstate()

def execmsg(self):
    "Translate the received message"
    pass

def chstate(self):
    "Change the state of the pipe depending on current state"
    if self.state=='noconnected':
        win32pipe.ConnectNamedPipe(self.hpipe,self.over)
        self.state='connectwait'
        return -6

    elif self.state=='connectwait':
        j,self.strbuf=win32file.ReadFile(self.hpipe,self.buffer,self.over)
        self.state='readwait'
        return -6

    elif self.state=='readwait':
        size=win32file.GetOverlappedResult(self.hpipe,self.over,1)
        self.msg=self.strbuf[:size]
        ret=self.execmsg()
        self.state = 'noconnected'
        win32pipe.DisconnectNamedPipe(self.hpipe)
        return ret

关于python - 将数据从 python 传输到 Windows 中的另一个应用程序的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/286614/

相关文章:

python - 如何在同一 prototxt 中生成用于训练和测试的数据层(HDF5)?

python - 修改 Pandas 每小时时间轴上的刻度数

c - 从 void * 数组获取值

c++ - 反射(reflect) SendMessage 的 Windows API 编辑框

c++ - 如何发光最小。最大和关闭按钮?

asp.net - 使用经典 ASP 从 COM 对象中检索字符串数组

python - 计算矩阵在所有对角线上的迹

python - 为什么 i += 1 更改为 i += 2 有效?

c# - 在 C# 中将 CSV 数据填充到现有 Excel 模板

c++ - 我可以使用 Excel::_Application::Run 调用 C# dll 方法吗