zoukankan      html  css  js  c++  java
  • python调用C++

    一。利用Ctypes

    2014-04-29

    EXAMPLE:

    //VS2012,新建WINDOWS Project ,下一步,选择dll


    //
    test.h #include<iostream> extern "C" int __declspec(dllexport)add(int x,int y); // .cpp #include "test.h" int __declspec(dllexport)add(int x,int y) { //std::cout<<x<<" "<<y<<std::endl; std::cout<<x+y<<std::endl; return x+y; }

    编译平台为X64(因为我的python为64位)

    import ctypes
    ll=ctypes.cdll.LoadLibrary
    lib=ll(r"D:VSProjectspyc1x64Debugpyc1.dll")
    lib.add(1,3)

    调用成功

    问题注意:

    1.python为64位,必须导入64位的dll,否则会发生win32错误

    2.路径在windows下为D:\。。。等等


     二。利用Python C API

     生成C++ dll 代码

    注意:因为我的python是安装包安装的,64,没有源码,只提供了include 和Release下的lib。所以编程平台必须为X64 Release

            debug会发生找不到python27_d.lib的错误


    #include "Python.h"

    static PyObject *ex_foo(PyObject *self, PyObject *args)
    {
    printf("Hello, world/n");
    Py_INCREF(Py_None);
    return Py_None;
    }

    static PyMethodDef example_methods[] =
    {
    {"foo", ex_foo, METH_VARARGS, "foo() doc string"},
    {NULL, NULL}
    };

    PyMODINIT_FUNC
    initexample(void)
    {
    Py_InitModule("example", example_methods);
    }

    
    static PyObject *ex_foo(PyObject *self, PyObject *args)
    {
        printf("Hello, world/n");
        Py_INCREF(Py_None);
        return Py_None;
    }
    
    static PyMethodDef example_methods[] = 
    {
        {"foo", ex_foo, METH_VARARGS, "foo() doc string"},
        {NULL, NULL}
    };
    
    PyMODINIT_FUNC
        initexample(void)
    {
        Py_InitModule("example", example_methods);
    }

    最后,将生成的dll改为.pyd后缀

    文件结构大概长这样

    test.py 代码:

    import os
        
    
    dllpath=".\"
    if dllpath not in os.sys.path:
        os.sys.path.append(dllpath)
    print os.sys.path
    
    import example
    example.foo()
    ['D:\VSProjects\PyCAPI\x64\Release', 'D:\Program Files\Python27\lib\site
    -packages\setuptools-3.4.1-py2.7.egg', 'D:\Program Files\Python27\lib\site-
    packages\gnumpy-0.2-py2.7.egg', 'C:\Windows\system32\python27.zip', 'D:\Pro
    gram Files\Python27\DLLs', 'D:\Program Files\Python27\lib', 'D:\Program Fi
    les\Python27\lib\plat-win', 'D:\Program Files\Python27\lib\lib-tk', 'D:\
    Program Files\Python27', 'D:\Program Files\Python27\lib\site-packages', 'D:
    \Program Files\Python27\lib\site-packages\wx-2.8-msw-unicode', '.\']
    
    Hello, world/n 请按任意键继续. . .

    参考资料:

    http://blog.csdn.net/vagrxie/article/details/3779247

    http://blog.csdn.net/vagrxie/article/details/5251306


  • 相关阅读:
    在ASP.Net中两种利用CSS实现多界面的方法
    c# 添加图片水印,可以指定水印位置+生成缩略图[付上帅图1,2,3,4]
    精力有限,本博客暂停维护,转到www.80back.com(个人的小站)
    设计一个silverlight的Button控件silverlight(银光)学习(1)
    asp.net(c#)上传图片生成缩略图
    DataGrid和存储过程结合的分页,只读取当前页数据
    c#实现google样式的分页
    asp.net MD5加密函数(c#)
    执行JS
    LoadRunner常见问题
  • 原文地址:https://www.cnblogs.com/karcylee/p/3698864.html
Copyright © 2011-2022 走看看