标签: boost-python

如何使用常规makefile构建一个与boost相关的项目?

我正在研究一个c ++项目,最近我们需要在其中加入一小部分的提升.增强部分实际上是最小的(Boost :: Python),因此,使用bjam来构建一切看起来像是一种矫枉过正(此外,每个参与该项目的人都对制作感觉很舒服,而且没有堵塞的知识).

我已经做了很多测试,但是我找不到一种方法来在我的makefile中包含以前提到的库并使构建成功.

你所有的帮助都是非常苛刻的.:)

c++ boost build-process makefile boost-python

8
推荐指数
1
解决办法
2390
查看次数

如何判断libboost_python.so使用的是什么python版本?

我想知道什么版本的python boost_python.so期待.这是在具有多个python版本的计算机上,我没有自己构建/安装boost(我也没有root访问权限).

我怎么知道为什么版本的python boost_python.so编译?

我没有在ldd的输出中找到任何有用的东西,但是在这里包含它,以防其他人看到的东西.

-bash-3.2$ ldd -v libboost_python.so.1.46.1 
libutil.so.1 => /lib64/libutil.so.1 (0x00002ad65582d000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002ad655a30000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002ad655c4b000)
librt.so.1 => /lib64/librt.so.1 (0x00002ad655e50000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002ad656059000)
libm.so.6 => /lib64/libm.so.6 (0x00002ad656359000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002ad6565dd000)
libc.so.6 => /lib64/libc.so.6 (0x00002ad6567eb000)
/lib64/ld-linux-x86-64.so.2 (0x000000374c600000)

Version information:
./libboost_python.so.1.46.1:
    libgcc_s.so.1 (GCC_3.0) => /lib64/libgcc_s.so.1
    libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
    libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
    libstdc++.so.6 (CXXABI_1.3) => /usr/lib64/libstdc++.so.6
    libstdc++.so.6 (GLIBCXX_3.4) => /usr/lib64/libstdc++.so.6
/lib64/libutil.so.1:
    libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libpthread.so.0:
    ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2 …
Run Code Online (Sandbox Code Playgroud)

python boost boost-python

8
推荐指数
1
解决办法
7551
查看次数

有关Boost :: Python和Boost :: Threads的问题

我和一个朋友正在开发一个使用Boost :: Python的应用程序.我已经在C++中定义了一个接口(很好是一个纯虚拟类),通过Boost :: Python公开给用户,他们必须从中继承并创建一个类,应用程序将其用于某些回调机制.

一切都很顺利.现在,函数回调可能需要一些时间(用户可能已编写了一些重要的东西)...但我们需要重新绘制窗口,因此它看起来并不"卡住".我们想使用Boost :: Thread来实现这一点.一次只能运行一个回调(没有其他线程会同时调用python),所以我们认为它不会那么大......因为我们不在python中使用线程,也不在包装为python的C++代码.

我们所做的是在Py_Initialize()之后调用PyEval_InitThreads(),然后,在调用它自己的boost线程中的函数回调之前,我们使用宏PY_BEGIN_ALLOW_THREADS,并在线程结束时使用宏PY_END_ALLOW_THREADS.

我想我不需要说执行永远不会到达第二个宏.它每次运行时都会显示几个错误...但是在调用实际回调时总是这样.我已经google了很多,甚至阅读了一些关于线程的PEP文档,但是他们都讨论了python模块中的线程(我不认为它只是一个纯粹的虚拟类暴露)或者在python中进行线程化,而不是主要的应用程序从多个线程调用Python.

请帮忙,这让我感到沮丧几个小时.

PS.救命!

c++ python boost-thread boost-python

7
推荐指数
1
解决办法
505
查看次数

如何从python文件中导入Boost.Python

我正在使用Boost.Python在我的C++可执行文件中嵌入一个解释器并执行一些预先编写的脚本.我有它的工作,所以我可以调用python文件中的函数,但我想使用的python代码导入外部文件,这些导入失败,因为'没有名为'的模块.如果我直接从python运行脚本,一切都按预期工作.

所以我的问题是在通过C++绑定运行的python脚本中导入模块的正确方法是什么?

C++代码:

#include "boost/python.hpp"

int main(int argc, char** argv)
{
  try
  {
    Py_Initialize();
    boost::python::object test = boost::python::import("__main__");
    boost::python::object testDict = test.attr("__dict__");
    boost::python::exec_file("test.py", testDict, testDict);

  }
  catch(boost::python::error_already_set& e)
  {
    PyErr_Print();
  }
return 0;

}
Run Code Online (Sandbox Code Playgroud)

Python代码:

import ModuleX
Run Code Online (Sandbox Code Playgroud)

c++ python import boost boost-python

7
推荐指数
1
解决办法
3922
查看次数

Boost Python Hello World示例不适用于Python

我在Python中使用Visual C++(由boost包装)的c ++代码时遇到了很多麻烦.

好吧,我正在使用的工具是:Visual Studio 2010,BoostPro 1_47,Windows 7和Python 2.7(32位).

我有以下代码在Visual Studio 2010中很好地编译:

#define BOOST_PYTHON_STATIC_LIB
#include <boost/python.hpp>
using namespace boost::python;

struct World
{
    void set(std::string msg) { this->msg = msg; }
    std::string greet() { return msg; }
    std::string msg;
};


BOOST_PYTHON_MODULE(hello)
{
    class_<World>("World")
            .def("greet", &World::greet)
            .def("set", &World::set);
}
Run Code Online (Sandbox Code Playgroud)

它的格式为:Win32控制台应用程序>>>空项目/ DLL.

在"项目属性"中:

VC++ DIRECTORIES: 
  I added:  
  >>> INCLUDE DIRECTORIES:  C:\Program Files\boost\boost_1_47;C:\Python27\include        .  
  >>> LIBRARY DIRECTORIES:  C:\Program Files\boost\boost_1_47\lib;C:\Python27\libs
Run Code Online (Sandbox Code Playgroud)

所有这些都使c ++文件构建,但后来我无法从Python访问它.

当我尝试使用模块时,这就是Python所说的:

">>> import hello
 Traceback (most recent call last):
   File "<pyshell#0>", line 1, …
Run Code Online (Sandbox Code Playgroud)

c++ python boost boost-python

7
推荐指数
1
解决办法
5544
查看次数

在boost :: python的add_property中使用c ++ 11 lambda作为访问器函数(get_signature在lambda中失败)

我想用C++ 11 lambda表达式作为访问功能boost::python的add_property,沿着下面的内容(拉姆达并不是必需在这个例子中,但将需要更复杂的东西拉姆达内部发生,如验证):

#include<boost/python.hpp>

struct A{
  A(): a(2){};
  int a;
};

BOOST_PYTHON_MODULE(boost_python_lambda)
{
  boost::python::class_<A>("A")
    // .def_readonly("a",&A::a) // the classical way: works fine 
    .add_property("a",[](const A& a){return a.a;})
  ;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用clang ++(版本3.2)编译和-std=c++11(结果与g ++ 4.7相同),我收到此错误:

/usr/include/boost/python/class.hpp:442:66: error: no matching function for call to 'get_signature'
        return python::make_function(f, default_call_policies(), detail::get_signature(f, (T*)0));
                                                                 ^~~~~~~~~~~~~~~~~~~~~
/usr/include/boost/python/class.hpp:422:22: note: in instantiation of function template specialization 'boost::python::class_<A,
      boost::python::detail::not_specified, boost::python::detail::not_specified,
      boost::python::detail::not_specified>::make_fn_impl<A, <lambda at boost_python_lambda.cpp:12:21> >' requested here
        return this->make_fn_impl(
                     ^
/usr/include/boost/python/class.hpp:309:40: note: in instantiation of function …
Run Code Online (Sandbox Code Playgroud)

c++ lambda boost-python c++11

7
推荐指数
2
解决办法
3062
查看次数

构建Boost.Python

我正在尝试根据官方网站上的说明构建Boost.Python.

我的操作系统是Windows 7 64位,编译器是MSVC11,增强是1.54.

===================安装Boost ==================

要安装基本的Boost,我从其网站下载了boost库,将其解压缩到我的本地磁盘.路径是C:\local\boost_1_54_0.

===============安装Boost.Python ===============

然后我发现Boost.Python需要单独构建.所以我遵循了Boost.Python指令.

===============安装Boost.Build ================

在3.1.2阶段,需要Boost.Build.所以我再次按照步骤安装Boost.Build C:\local\boost_1_54_0\BoostBuild,并添加C:\local\boost_1_54_0\BoostBuild\bin到Path环境变量中.

然后我被困在阶段3.1.3和3.1.4,指令说

3.cd进入Boost安装的libs/python/example/quickstart /目录,其中包含一个小示例项目.

4.Invoke bjam.将"入门指南"第5节中的示例调用中的"stage"参数替换为"test",以构建所有测试目标.还要添加参数"--verbose-test"以查看测试运行时生成的输出.

在Windows上,您的bjam调用可能类似于:

C:\ boost_1_34_0\...\quickstart> bjam toolset = msvc --verbose-test test

我输入了指令告诉我的命令行,我确信我在正确的目录中.然而,不存在bjam或b2中quickstart文件夹(它们是在升压和C的根direcroty:\本地\ boost_1_54_0\BoostBuild\bin)中.

我甚至试图将这两个文件复制到该quickstart文件夹,但根本不起作用.

我对Windows管理机制不太熟悉,因此不确定这是否Path是我的问题的关键.我想后,我添加了bin文件夹到PATH,操作系统会自动我的链接bjam toolset=msvc --verbose-test test到bjam的在C:\local\boost_1_54_0\BoostBuild\bin文件夹?

谁能帮我这个?:)

command-line boost path boost-python

7
推荐指数
1
解决办法
1万
查看次数

使从boost-python类继承的Python类具有可复制性

我有一个继承自boost-python类的类:

class Magnet(CMagnet):   # CMagnet is a C++ based boost-python class
    def __init__(self):
        CMagnet.__init__(self)

    def python_method(self):
        ...
Run Code Online (Sandbox Code Playgroud)

在CMagnet的C ++实现中,我使用了1中的代码,如2中所示。

我现在遇到以下问题:执行以下操作时:

magnet = Magnet()
magnet_2 = copy.deepcopy(magnet)
Run Code Online (Sandbox Code Playgroud)

然后magnet是类型Magnet,magnet_2但是是类型CMagnet。我需要它也要类型Magnet。它缺少所有Magnet方法。如何获得Deepcopy来复制(并返回)整个Magnet对象,而不仅仅是CMagnet零件的副本?

python deep-copy boost-python

7
推荐指数
1
解决办法
99
查看次数

无法构建 boost python 库(致命错误:pyconfig.h:没有这样的文件或目录)

我正在尝试在我的 ubuntu 上构建 boost python 库。但是,当我执行

./b2 --with-python
Run Code Online (Sandbox Code Playgroud)

它总是返回与我相关的错误

./boost/python/detail/wrap_python.hpp:57:11: fatal error: pyconfig.h: No such file or directory
 # include <pyconfig.h>
           ^~~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

我尝试在线查找,例如https://github.com/boostorg/build/issues/289

按照他们的建议,我检查了我的“project-config.jam”,我发现

# Python configuration
import python ;
if ! [ python.configured ]
{
    using python : 3.7 : /home/lowlimb/anaconda3 :/home/lowlimb/anaconda3/include/python3.7m;
}

Run Code Online (Sandbox Code Playgroud)

这是正确的,因此我真的不知道如何解决这个问题。有人可以给我一些建议吗?

c++ python ubuntu boost boost-python

7
推荐指数
3
解决办法
1万
查看次数

编译boost时地址模型错误

我编写了一个混合 Python 3 和 C++ 的程序。我在 Windows 上使用 boost-python 1.62 和 mingw。到目前为止,我已经在许多机器上编译了 C++ python 库,并且它一直运行良好。现在我将源代码提供给一位同事在他的机器上安装,编译失败,mingw 抱怨符号问题和“文件格式无法识别”。

但是,我看到的是以下内容:在我的机器上,b2 在编译开始时报告了这一点:

  • 32 位:无(缓存)
  • 64 位:是(缓存)
  • 手臂:否(缓存)
  • mips1 : 没有(缓存)
  • 电源:否(缓存)
  • sparc : 没有(缓存)
  • x86 : 是(缓存)
  • 支持符号链接:是

在我同事的机器上,它看起来像这样:

  • 32 位:是(缓存)
  • 手臂:否(缓存)
  • mips1 : 没有(缓存)
  • 电源:否(缓存)
  • sparc : 没有(缓存)
  • x86 : 是(缓存)
  • 支持符号链接:是

我很确定问题与他的系统试图编译 32 位代码并试图将现有的 64 位代码链接到它有关。不过,问题是,为什么它首先要尝试编译 32 位代码?机器不到一年,所以肯定是64位的。然而,更重要的问题是,如何说服机器使用 64 位进行编译?

顺便说一下,这是我的 user-config.jam:

using python : 3.6 : C:\\StreamTest\\WinPython-64bit-3.6.6.2\\python-3.6.6.amd64\\python.exe
  : C:\\StreamTest\\WinPython-64bit-3.6.6.2\\python-3.6.6.amd64\\include
  : C:\\StreamTest\\WinPython-64bit-3.6.6.2\\python-3.6.6.amd64\\libs
  : ;
Run Code Online (Sandbox Code Playgroud)

python boost mingw boost-python

7
推荐指数
1
解决办法
150
查看次数