蒂姆写道: 蒂姆,让我们尝试稍作备份. 据我了解,你 在Windows下运行,您想使用共享内存,大概是 在两个过程之间. 您知道CreateFileMapping/MapViewOffile API,可能来自MSDN [1]的示例,您想使用它 Windows *中的技术 *无 *显式文件备份. 我到目前为止对吗? 我建议使用MMAP模块,您似乎在上面拿起 并试图使用您的CTYPES解决方案 *和 * MMAP 模块作为相同机制的两半. 也许我误会了 但这就是外观. 然后,您问了一个有关抓住python对象的问题 内存地址可以将其传递到CTYPES解决方案中. (考虑到该解决方案的性质,这是有道理的). 您似乎错过的是您的CTYPES代码正在做 *准确* mmapmodule.c代码(这是实现) MMAP模块的幕后幕后为您做. 这是您的代码(非常重新格式化):
szname = c_char_p(name) hmapobject = windll.kernel32.createfilempappinga( invalid_handle_value, 没有任何, page_readonly, 0, table_shmemsize, szname ) if(hmapobject == 0): 打印" OpenKey:无法打开名称文件映射对象" 提高winerror() self.pdata = windll.kernel32.mapviewoffile( hmapobject, file_map_all_access, 0, 0, table_shmemsize )
这是mmapmodule.c的代码(也重新格式化 并剪了):
m_obj-> map_handle = createfilemapping( m_obj-> file_handle, 无效的, flprotect, size_hi, size_lo, m_obj-> tagname ); if(m_obj-> map_handle!= null){ m_obj-> data =(char *)mapViewOffile( m_obj-> map_handle, dwdesiredaccess, 0, 0, 0 );
希望您能看到他们基本上也在做同样的事情 事物. (给定适当的参数). 唯一的 明确的差异是最终参数到MapViewOffile 在Python代码中为0,MSDN文档[2]表示该代码. "如果此参数为0(零),则映射扩展 从指定的偏移到文件映射的末尾." 尚不清楚如何适用于非文件支持 filemapping,但我 *假设 * Python Devs已经测试过 那. 简而言之,通过共享进行两个Python流程谈话 内存(不链接到特定文件)以下 为我工作:
导入mmap # #0特殊文件值可以为-1在Python 2.5中 # shmem = mmap.mmap(0,1000," tjg",mmap.access_write) shmem.write("等等") </code-a> <code-b> 导入mmap shmem = mmap.mmap(0,1000," tjg",mmap.access_write) 打印shmem.read(9)
显然,我使用了虚拟代码和值,但是 .write和.read(以及其他辅助方法) 使用字符串, 您总是可以随时腌制或元帅任意 Python数据将其移动. 我希望这一切有帮助; 如果没有别的,它是给予的 我在阅读stdlib的代码时进行一些练习, 不好! TJG [1] http://msdn2.microsoft.com/en-us/library/aa366551.aspx [2] http://msdn2.microsoft.com/en-us/library/aa366761.aspx(_@_ _)