【问题标题】:python code to c++ lib or dllpython代码到c++ lib或dll
【发布时间】:2012-04-26 11:20:22
【问题描述】:

我有一些我想在 C++ 中使用的 python 代码,我想在 lib 或 dll 中构建它?我该怎么做? 代码有依赖关系:

import socket
import string
import struct
import sys

也许是PIL

【问题讨论】:

    标签: c++ python dll


    【解决方案1】:

    你可以用cython写thin wrapper to export it to C

    Cython 库helloWorld.pyx:

    import sys
    sys.path.append(".") #yourlib is in current folder
    import yourlib #you can import any python module
    
    cdef public void helloWorld():
        print "Hello World Cython!"
        yourlib.helloWorld("Python")
    
    cdef public int my_sum(int x, int y):
        return x*x+y
    
    from libcpp.string cimport string
    
    cdef public string testString( string sx, string sy ):
        x = int(sx.c_str())
        y = int(sy.c_str())
        ret= "%d*%d+%d=%d"%(x,x,y,my_sum(x,y))
        cdef char* ret2= ret
        return string( ret2 )
    

    用 cython 编译(创建 helloWorld.cpphelloWorld.h):

        cython --cplus helloWorld.pyx
    

    你的代码program.cpp:

    #include <string>
    #include <iostream>
    #include "Python.h"
    #include "helloWorld.h" // it's cpp header so remove __PYX_EXTERN_C (bug)
    
    int main(int argc, char *argv[]) {
        Py_Initialize(); //start python interpreter
        inithelloWorld(); //run module helloWorld
        helloWorld();
        std::cout << testString("6","6") << std::endl; #it's fast!
        Py_Finalize();
        return 0;
    }
    

    编译运行:

        g++ program.cpp helloWorld.cpp -I/usr/include/python2.7/ -lpython2.7
        ./a.out
        Hello World Cython!
        Hello World Python!
        6*6+6=42
    

    另一种方法是使用boost::python

    你的代码program.cpp:

    #include <string>
    #include <iostream>
    #include <boost/python.hpp>
    
    int main(int argc, char *argv[]) {
        Py_Initialize();
        boost::python::object sys = boost::python::import("sys");
        sys.attr("path").attr("append")(".");
        boost::python::object main_module = boost::python::import("yourlib");
        main_module.attr("helloWorld")("boost_python");
        boost::python::object ret= main_module.attr( "my_sum" )( 10, 10 );
        std::cout << boost::python::extract<char const*>(ret) << std::endl;
        Py_Finalize();
        return 0;
    }
    

    编译运行:

        g++ program.cpp -I/usr/include/python2.7/ -lpython2.7 -lpython_boost
        ./a.out
        Hello World boost_python!
        10*10+10=110
    

    【讨论】:

    • 也许你给我一些简单的例子? # hello.py def my_sum(x,y): print "Hello World!" return x*x+y 如何从 c++ 调用此代码?类似代码 C++ int sum= py.my_sum(x,y);
    • 谢谢例如!它有效,但如何访问类的方法? codeclass class_cl: def myadd(a,b): print("hell0 add") return a*a+b
    • 你的意思是第二个例子? boost::python::object ret= main_module.attr("class_cl")().attr("myadd")(1,2)。它按顺序工作:获取类的引用,创建实例,获取myadd 方法并使用 1,2 调用它。
    【解决方案2】:

    您可能想检查如何在另一个应用程序中嵌入 python (http://docs.python.org/extending/embedding.html)。

    【讨论】:

    • 如果我使用这种方法并且我想在另一台计算机上运行我的程序,我必须安装 python 解释器?
    • @mrgloom 是的,但是对于任何类型的 cpython 代码都是如此。从未尝试过(对于嵌入式代码),但我认为您可以使用冻结或类似工具仅将必要的文件打包到您的应用程序中,我看不出有什么理由不这样做。显然,您还必须在您的 c 程序中包含正确的解释器库
    • 对我来说听起来很复杂。我只想将 python 代码放入 lib 或 dll 中(只构建一次,以后不要使用解释器)并可以从我的 c++ 代码中访问它(主程序)。也许网上有一些例子?
    • @mrgloom:不,如果您将 Python 嵌入到您的应用程序中,则不需要在目标机器上安装 Python。您只需将 Python DLL 和您需要的所有 Python 模块(这些可以放在单个 .zip 中)与您的应用程序一起分发
    • 是的,我设法通过将pithon27.dll和Lib与.py文件放在我的项目中来做到这一点,我知道我可以使用installshield之类的东西分发它,但是有没有办法构建它在一个 .exe 文件中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多