我正在研究一个c ++项目,最近我们需要在其中加入一小部分的提升.增强部分实际上是最小的(Boost :: Python),因此,使用bjam来构建一切看起来像是一种矫枉过正(此外,每个参与该项目的人都对制作感觉很舒服,而且没有堵塞的知识).
我已经做了很多测试,但是我找不到一种方法来在我的makefile中包含以前提到的库并使构建成功.
你所有的帮助都是非常苛刻的.:)
我想知道什么版本的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) 我和一个朋友正在开发一个使用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.救命!
我正在使用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) 我在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++ 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) 我正在尝试根据官方网站上的说明构建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文件夹?
谁能帮我这个?:)
我有一个继承自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零件的副本?
我正在尝试在我的 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)
这是正确的,因此我真的不知道如何解决这个问题。有人可以给我一些建议吗?
我编写了一个混合 Python 3 和 C++ 的程序。我在 Windows 上使用 boost-python 1.62 和 mingw。到目前为止,我已经在许多机器上编译了 C++ python 库,并且它一直运行良好。现在我将源代码提供给一位同事在他的机器上安装,编译失败,mingw 抱怨符号问题和“文件格式无法识别”。
但是,我看到的是以下内容:在我的机器上,b2 在编译开始时报告了这一点:
在我同事的机器上,它看起来像这样:
我很确定问题与他的系统试图编译 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) boost-python ×10
boost ×7
python ×7
c++ ×6
boost-thread ×1
c++11 ×1
command-line ×1
deep-copy ×1
import ×1
lambda ×1
makefile ×1
mingw ×1
path ×1
ubuntu ×1