【发布时间】:2012-04-26 11:20:22
【问题描述】:
我有一些我想在 C++ 中使用的 python 代码,我想在 lib 或 dll 中构建它?我该怎么做? 代码有依赖关系:
import socket
import string
import struct
import sys
也许是PIL
【问题讨论】:
我有一些我想在 C++ 中使用的 python 代码,我想在 lib 或 dll 中构建它?我该怎么做? 代码有依赖关系:
import socket
import string
import struct
import sys
也许是PIL
【问题讨论】:
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.cpp,helloWorld.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
你的代码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
【讨论】:
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 调用它。
您可能想检查如何在另一个应用程序中嵌入 python (http://docs.python.org/extending/embedding.html)。
【讨论】: