文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

为Python创建扩展,使python能

2023-01-31 06:28

关注
在架构服务器的时候,使用了IOCP来收发数据,使用Python写解包入库程序,那么要让两个进程通信,有很多方法,这里使用了内存共享的方法
python本来没有内存共享(我没有找到,也不知道是不是真的没有,但是和C++的程序共享内存,我想确实没有的吧),那么只好自己用C写个扩展,方法记录下来,以备后用
 
首先是扩展的*.c程序
MEM.c
#include "Python.h"
#include <windows.h>
#include <stdio.h>

int ShareMemory(char arg[],char str[]){
  HANDLE hMapFile = OpenFileMapping(
      FILE_MAP_ALL_ACCESS,
      FALSE,
      arg
      );
  if(hMapFile == NULL){
    return 1;
  }
  LPVOID lpMapAddress = MapViewOfFile(
      hMapFile,
      FILE_MAP_ALL_ACCESS,
      0,
      0,
      0
      );
  if(lpMapAddress == NULL){
    return 1;
  }

//  cout << (char *)lpMapAddress << endl;
  lstrcpy(str,(char *)lpMapAddress);
  UnmapViewOfFile(lpMapAddress);
  return 0;
}

static PyObject *
PyExt_fac(PyObject *self,PyObject *args){
  char *str;
  char str1[4096];
  PyObject *retval;
  if(!PyArg_ParseTuple(args,"s",&str));
  ShareMemory(str,str1);
  retval = (PyObject *)Py_BuildValue("s",str1);
  return retval;
}

static PyMethodDef
PyExtMethods[] = {
  {"fac",PyExt_fac,METH_VARARGS},
  {NULL,NULL}
};

void initPyExt(){
  Py_InitModule("PyExt",PyExtMethods);
}
 
接下来写setup.py编译
from distutils.core import setup,Extension

MOD = 'PyExt'

setup(name=MOD,ext_modules=[
        Extension(MOD,sources=['MEM.c'])])
 
在命令行下键入:
setup.py build -c mingw32
如果安装了vs2003那么只要这样
setup.py build
如果看到这样的提示:
running build
running build_ext
building 'PyExt' extension
D:\Qt\QtCreator\mingw\bin\gcc.exe -mno-cygwin -mdll -O -Wall -ID:\Python25\include -ID:\Python25\PC
-c MEM.c -o build\temp.win32-2.5\Release\mem.o
writing build\temp.win32-2.5\Release\PyExt.def
D:\Qt\QtCreator\mingw\bin\gcc.exe -mno-cygwin -shared -s build\temp.win32-2.5\Release\mem.o build\te
mp.win32-2.5\Release\PyExt.def -LD:\Python25\libs -LD:\Python25\PCBuild -lpython25 -lmsvcr71 -o buil
d\lib.win32-2.5\PyExt.pyd
说明编译成功了,编译后的.pyc文件在build\lib.win32-2.5目录里
吧这个.pyc文件拷贝到工程目录下,建立一个py文件来测试一下
from PyExt import fac
str2 = fac('你的共享内存申请字符串')
print str2
运行这个程序:
已经获得了正确的输出
阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯