我是否一个人试图使用以下组合:boost_1_45_0,MSVC 10,Python31?
我发现来自boost的基本样本(boost_1_45_0\libs\python\example\quickstart\embedding.cpp)既没有编译(我发现如何修复它,见下文)也没有工作.编译时间问题:
if (PyImport_AppendInittab("embedded_hello", initembedded_hello) == -1)
throw std::runtime_error("Failed to add embedded_hello to the interpreter's "
"builtin modules");
Run Code Online (Sandbox Code Playgroud)
我发现正确的名称不是initembedded_hello而是init_module_embedded_hello.所以我的第一个问题是我对这个重命名是对的吗?
第二个问题是SystemError: NULL result without error in PyObject_Call导入我声明的模块时:
from embedded_hello import *
Run Code Online (Sandbox Code Playgroud)
注释掉导入显示内部python的模块(如io)工作正常.那么第二个问题是导入的问题是什么?
任何帮助,将不胜感激!
我的C++库是用Python导入的,我需要调用InitGoogleLogging().我的C++库使用Boost.Python.
导入库时如何调用函数?
我想提供python的接口到我的C++ shared library,我计划使用Boost::python的是相同的,我C++基于代码是巨大的,整个分headers和implementation文件.但是所有的python::boost例子都讨论了python::boost在cpp文件中添加构造以及如何处理头文件.我可以使用相同的代码,以便我可以构建C++共享库和python modules
我想开始使用boost:python将python嵌入我的C ++程序中,但是我已经遇到了以下简单代码的问题:
#include <boost/python.hpp> //boost libraries
#include <Python.h> //python libraries
using namespace boost::python;
int main()
{
Py_Initialize();
object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我只是启动解释器并导入主模块,但是编译器已经遇到了问题:
/home/i7941878/Code/pythonTest/main.cpp:-1: error: undefined reference to `boost::python::detail::str_base::str_base(char const*)'
/home/i7941878/Code/pythonTest/main.cpp:-1: error: undefined reference to `boost::python::import(boost::python::str)'
/home/i7941878/Code/pythonTest/main.cpp:-1: error: undefined reference to `boost::python::api::getattr(boost::python::api::object const&, char const*)'
Run Code Online (Sandbox Code Playgroud)
我不知道为什么会出现这些错误。我很确定boost:python是正确构建的。
有人能启发我吗?
我正在使用QT Creator进行构建和编译。如果我使用G ++进行编译,-I/usr/include -I/usr/include/python2.6 main.cpp则会得到:
/tmp/ccI8x97b.o: In function `main':
main.cpp:(.text+0xc): undefined reference to `Py_Initialize'
main.cpp:(.text+0x30): undefined reference to `boost::python::import(boost::python::str)'
/tmp/ccI8x97b.o: In function `boost::python::api::object::object()':
main.cpp:(.text._ZN5boost6python3api6objectC2Ev[_ZN5boost6python3api6objectC5Ev]+0xd): undefined …Run Code Online (Sandbox Code Playgroud) 我决定让我的程序与windows环境兼容.但我在windows上的编程经验很少.有些错误需要帮助.
环境:
我只复制并测试来自".\ boost_1_52_0\libs\python\example\tutorial"的这个"hello"代码
码:
#include <iostream>
#include <boost/python/module.hpp>
#include <boost/python/def.hpp>
char const* greet()
{ return "hello, world"; }
BOOST_PYTHON_MODULE(hello_ext)
{
using namespace boost::python;
def("greet", greet);
}
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误信息:
mingw32-g++.exe -Wall -fexceptions -g -ID:\boost\include\boost-1_52 -IC:\Python27\include -c E:\project\snail-MW\test1\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -LD:\boost\lib\ -LC:\Python27\libs -o bin\Debug\test1.exe obj\Debug\main.o
obj\Debug\main.o: In function `inithello_ext':
E:/project/snail-MW/test1/main.cpp:11: undefined reference to `boost::python::detail::init_module(char …Run Code Online (Sandbox Code Playgroud) 我有一些python字节码文件为"a.pyc","b.pyc".我想用c ++代码运行这个文件.代码可以调用boost.python或python/c api.PyEval_EvalCode?
PyObject* PyEval_EvalCode(PyCodeObject *co, PyObject *globals, PyObject *locals)
Run Code Online (Sandbox Code Playgroud)
但是如何从字节码文件中获取PyCodeObject.
使用以下方法可以"剥离"函数参数类型:
void foo_double(double a)
{
}
void foo_int(int a)
{
}
template <class R, class A0>
void bar(R (*fp)(A0))
{
// Do something related with A0
}
int main()
{
bar(foo_double); // A0 is double
bar(foo_int); // A0 is int
}
Run Code Online (Sandbox Code Playgroud)
是否可以对类构造函数执行相同的"参数类型剥离"?
我相信我没有在原始代码片段中清楚地解释自己.这是完整的方案.
我有多个类C1,...,Cn,我需要将它们作为函数公开给python.让我们假设所有类都有一个共同的void Run()方法.但是,这些类的构造函数接受不同的参数.为了向python公开函数,我使用boost.python,它自动将函数导出到适当的python函数,同时处理所有类型的转换(主要是基元).
我的第一个解决方案是
class C1
{
public:
C1() {}
void Run();
};
class C2
{
public:
C2(double a) {}
void Run();
};
template <class T>
void python_wrapper()
{
T instance();
instance.Run();
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试在嵌入式Python中使用Numpy.我使用Python 3.4和boost :: python与Boost 1.57.为了防止Python设置一个信号处理程序,阻止我用Ctrl + C杀死我的程序,我使用Py_InitializeEx(0).
现在的问题是,当我调用import_array()来设置Numpy时,这似乎添加了信号处理程序,我无法再使用Ctrl + C终止该程序.
以下是示例程序:
#include <boost/python.hpp>
#define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION
#define PY_ARRAY_UNIQUE_SYMBOL damaris_ARRAY_API
#include <numpy/arrayobject.h>
using namespace boost::python;
static void* init_numpy() {
import_array();
return NULL;
}
int main( int argc, char ** argv ) {
try {
Py_InitializeEx(0);
object main_module((
handle<>(borrowed(PyImport_AddModule("__main__")))));
object main_namespace = main_module.attr("__dict__");
init_numpy();
handle<> ignored(( PyRun_String( "print(\"Hello, World\")",
Py_file_input,
main_namespace.ptr(),
main_namespace.ptr() ) ));
while(1) {
sleep(1);
}
} catch( error_already_set ) {
PyErr_Print();
}
}
Run Code Online (Sandbox Code Playgroud)
在main中注释"init_numpy"行时,我可以使用Ctrl + C终止程序.我怎样才能使Python仍然使用Numpy时不会捕获信号?
我想从C++设置一个Python变量,以便C++程序可以创建一个对象Game* game = new Game();,以便Python代码能够引用这个实例(和调用函数等).我怎样才能做到这一点?
我觉得我对Python或Boost-Python的工作方式有一些核心的误解.
该行在main_module.attr("game") = gametry catch语句中,并且错误(使用PyErr_Fetch)是"为C++类型找到No to_python(by-value)转换器:class Game".
例如
class_<Game>("Game")
.def("add", &Game::add)
;
object main_module = import("__main__");
Game* game = new Game();
main_module.attr("game") = game; //This does not work
Run Code Online (Sandbox Code Playgroud)
来自Python:
import testmodule
testmodule.game.foo(7)
Run Code Online (Sandbox Code Playgroud) 我有一个Python应用程序调用C++ boost python库,它都可以工作.但是,我有一个回调C++到Python的场景,其中来自boost线程的C++调用python,我在C++端获得访问冲突.如果我使用python线程执行完全相同的回调,它可以完美地工作.因此我怀疑我不能简单地使用boost线程从C++回调Python,但需要做一些额外的工作吗?
boost-python ×10
c++ ×8
python ×8
boost ×4
boost-thread ×1
c ×1
embed ×1
mingw ×1
numpy ×1
python-3.x ×1
templates ×1