标签: boost-python

Boost Python示例失败了两次

我是否一个人试图使用以下组合: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)工作正常.那么第二个问题是导入的问题是什么?

任何帮助,将不胜感激!

visual-studio-2010 boost-python python-3.x

2
推荐指数
1
解决办法
1213
查看次数

模块导入时的boost.python代码

我的C++库是用Python导入的,我需要调用InitGoogleLogging().我的C++库使用Boost.Python.

导入库时如何调用函数?

python boost-python

2
推荐指数
1
解决办法
1821
查看次数

提升Python和C++头文件

我想提供python的接口到我的C++ shared library,我计划使用Boost::python的是相同的,我C++基于代码是巨大的,整个分headersimplementation文件.但是所有的python::boost例子都讨论了python::boostcpp文件中添加构造以及如何处理头文件.我可以使用相同的代码,以便我可以构建C++共享库和python modules

c++ python boost boost-python

2
推荐指数
1
解决办法
1543
查看次数

基本的boost:pyton程序中未定义的参考

我想开始使用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)

c++ python embed boost boost-python

2
推荐指数
1
解决办法
3788
查看次数

用win7-64bit中的mingw编译一些带有boost.python的代码

我决定让我的程序与windows环境兼容.但我在windows上的编程经验很少.有些错误需要帮助.

环境:

  • os:win7-64bit,
  • ide:codeblocks12.11,
  • python:Python 2.7.3 Windows X86-64安装程序(Windows AMD64/Intel 64/X86-64二进制文件[1] - 不包含源代码)
  • 编译器:mingw来自codeblocks安装包.
  • 提升:boost1.52

我只复制并测试来自".\ 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)

c++ python boost mingw boost-python

2
推荐指数
1
解决办法
2862
查看次数

如何通过boost.python或python/c api调用python字节码文件

我有一些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.

c c++ python boost-python

2
推荐指数
1
解决办法
1005
查看次数

构造函数参数的模板参数推断

使用以下方法可以"剥离"函数参数类型:

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)

c++ templates boost-python template-meta-programming

2
推荐指数
1
解决办法
2443
查看次数

Python import_array使用ctrl-c无法杀死嵌入式python

我正在尝试在嵌入式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 numpy boost-python

2
推荐指数
1
解决办法
865
查看次数

使用boost-python将python变量设置为C++对象指针

我想从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)

c++ python boost boost-python

2
推荐指数
1
解决办法
2103
查看次数

如何从boost线程调用Python?

我有一个Python应用程序调用C++ boost python库,它都可以工作.但是,我有一个回调C++到Python的场景,其中来自boost线程的C++调用python,我在C++端获得访问冲突.如果我使用python线程执行完全相同的回调,它可以完美地工作.因此我怀疑我不能简单地使用boost线程从C++回调Python,但需要做一些额外的工作吗?

c++ python multithreading boost-thread boost-python

2
推荐指数
1
解决办法
871
查看次数