我使用正确的Python配置使用b2编译了boost 1.50.0库.这是命令的相关输出b2 --debug-configuration:
notice: [python-cfg] Configuring python...
notice: [python-cfg] user-specified cmd-or-prefix: "C:\Python33z\python"
notice: [python-cfg] Checking interpreter command "C:\Python33z\python"...
notice: [python-cfg] running command 'DIR /-C /A:S "C:\Python33z\python.exe" 2>&
1'
notice: [python-cfg] running command '"C:\Python33z\python" -c "from sys import
*; print('version=%d.%d\nplatform=%s\nprefix=%s\nexec_prefix=%s\nexecutable=%s'
% (version_info[0],version_info[1],platform,prefix,exec_prefix,executable))" 2>&
1' notice: [python-cfg] Configuring python...
notice: [python-cfg] user-specified cmd-or-prefix: "C:\Python33z\python"
notice: [python-cfg] Checking interpreter command "C:\Python33z\python"...
notice: [python-cfg] running command 'DIR /-C /A:S "C:\Python33z\python.exe" 2>&
1'
notice: [python-cfg] running command '"C:\Python33z\python" -c "from sys import
*; …Run Code Online (Sandbox Code Playgroud) 我已经设法编译了Boost.Python'第一次尝试',但我不确定如何将它导入python并调用它包含的方法.我的源文件如下:
#include <stdlib.h>
#include <string>
#include <boost/python.hpp>
using namespace boost::python;
int test(int i)
{
fprintf(stderr, "%s:\n", __FUNCTION__);
return i * 5;
}
BOOST_PYTHON_MODULE(ipg)
{
using namespace boost::python;
def("test", test);
}
Run Code Online (Sandbox Code Playgroud)
我的makefile包含:
# Which compiler?
CC=c++
# Which flags for object files?
OFLAGS=-c -Wall -fPIC
# Which flags for the output binary?
BFLAGS=-Wall -shared -o ipg
# Which flags for boost python?
BPFLAGS=-I/usr/include/python2.7
BLIBS=-lpython2.7 -lboost_python -lboost_system
# Make.
all: source/python.cpp
$(CC) $(BOUT) $(BFLAGS) $(BPFLAGS) $? $(BLIBS)
Run Code Online (Sandbox Code Playgroud)
和我的测试脚本:
import sys
# My …Run Code Online (Sandbox Code Playgroud) 这是我的问题:
我有两个这样的课程:
class Signal {
public:
void connect(...) { sig.connect(...); }
private:
boost::signal2::signal sig;
};
class MyClass {
public:
Signal on_event;
};
Run Code Online (Sandbox Code Playgroud)
我想暴露,MyClass::on_event以便我可以my_class_instance.on_event.connect(...)从Python 调用.
这就是我如何包装这些类:
class_<Signal, boost::noncopyable> ("Signal", noinit)
.def("connect", &some_helper_function);
class_<MyClass> ("MyClass")
.def_readonly("on_event", &MyClass::on_event);
Run Code Online (Sandbox Code Playgroud)
这编译,但当我尝试connect从Python 调用时,我得到:AttributeError: can't set attribute.这在这里解释:http://www.boost.org/doc/libs/1_53_0/libs/python/doc/tutorial/doc/html/python/exposing.html,所以我改为.def_readwritefor on_event.
但现在我得到了编译时错误.它几乎不可能读取C++模板错误消息,但据我所知,因为它boost::signals2::signal是不可复制的.由于.def_readwrite使成员可分配,因此它不能是不可复制的.但对于我的用法我不想分配成员,我只是不想调用一个方法.
我考虑制作const 的connect方法Signal,即使它改变了对象,但是我不能sig.connect()从那个方法调用,所以这是一个不行的...
有任何想法吗?
我是Boost的新手,我无法理解的其中一个库是Boost.Python。谁能详细解释一下这种互操作性是如何实现的?在文档中,只有几句话涉及元编程。PS我试图看代码,但是由于我缺乏C ++知识,所以我不懂原理。提前致谢
我有以下增强python代码:
#include <boost/python.hpp>
namespace bp = boost::python;
class PyExtTest
{
public:
std::string get_name() { return m_name; }
void set_name(std::string const& name) { m_name = name; }
private:
std::string m_name;
};
BOOST_PYTHON_MODULE(test_ext)
{
bp::class_<PyExtTest>("pet")
.add_property("name", &PyExtTest::get_name, &PyExtTest::set_name)
;
}
Run Code Online (Sandbox Code Playgroud)
我使用distutils将其编译为以下目录层次结构:
build/lib/test_ext.so
Run Code Online (Sandbox Code Playgroud)
然后按以下方式使用(PYTHONPATH设置为build/lib):
import test_ext
a = test_ext.pet
a.name = 'dog'
print a.name # dog
Run Code Online (Sandbox Code Playgroud)
当我将distutils配置为test_ext作为package的一部分安装时pkg,python不再能够找到该模块。我最终得到目录层次结构:
build/lib/pkg
build/lib/pkg/__init__.py
build/lib/pkg/test_ext.so
Run Code Online (Sandbox Code Playgroud)
使用以下安装脚本:
test_module = Extension('pkg.test_ext'
, define_macros = module_macros
, extra_compile_args = module_compiler_flags
, sources = …Run Code Online (Sandbox Code Playgroud) 在编写我的第一个django应用程序时,我遇到了boost :: python的以下问题.从python代码,我需要将io.BytesIO传递给带有std :: istream的C++类.
我有一个遗留的C++库,用于读取某种格式的文件.我们打电话是somelib.该库的接口使用std :: istream作为输入.像这样的东西:
class SomeReader
{
public:
bool read_from_stream(std::istream&);
};
Run Code Online (Sandbox Code Playgroud)
我想包装它,以便我可以通过以下方式使用python中的lib:
reader = somelib.SomeReader()
print ">>Pyhton: reading from BytesIO"
buf = io.BytesIO("Hello Stack Overflow")
reader.read(buf)
Run Code Online (Sandbox Code Playgroud)
我发现了如何为实际的python文件对象做到这一点.但目前尚不清楚如何为任意文件类对象做这件事.这是我到目前为止的python绑定的定义:
using namespace boost::python;
namespace io = boost::iostreams;
struct SomeReaderWrap: SomeReader, wrapper<SomeReader>
{
bool read(object &py_file)
{
if (PyFile_Check(py_file.ptr()))
{
FILE* handle = PyFile_AsFile(py_file.ptr());
io::stream_buffer<io::file_descriptor_source> fpstream (fileno(handle), io::never_close_handle);
std::istream in(&fpstream);
return this->read_from_stream(in);
}
else
{
//
// …Run Code Online (Sandbox Code Playgroud) 我尝试将Python脚本嵌入到我的C++程序中.在阅读了有关嵌入和扩展的一些内容之后,我了解了如何打开自己的python脚本以及如何将一些整数传递给它.但现在我有点不明白如何解决我的问题.我必须做两件事,从C++调用Python函数并从我的嵌入式Python脚本调用C++函数.但我不知道从哪里开始.我知道我必须编译.so文件以将我的C++函数暴露给Python,但这不是我能做的,因为我必须嵌入我的Python文件并使用C++代码控制它(我必须使用脚本语言,使一些逻辑易于编辑).
那么,有什么方法可以做这两件事吗?从C++调用Python函数并从Python调用C++函数?
这是我的C++代码
#include <Python.h>
#include <boost/python.hpp>
using namespace boost::python;
// <----------I want to use this struct in my python file---------
struct World
{
void set(std::string msg) { this->msg = msg; }
std::string greet() { return msg; }
std::string msg;
};
// Exposing the function like its explained in the boost.python manual
// but this needs to be compiled to a .so to be read from the multiply.py
BOOST_PYTHON_MODULE(hello)
{
class_<World>("World")
.def("greet", &World::greet)
.def("set", &World::set)
;
}
// <---------------------------------------------------------------
int …Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用boost_python和python 3.5.2。全部由Ubuntu 14。
当我--with-shared在Ubuntu中从源代码构建Python 3.5.2时,得到了libpython3.so(7.6kB)和libpython3.5m.so(12MB)。我认为大的是真实的,小的可能是将呼叫转发到真实接口的东西。
由于boost_python可能假定客户端要针对python进行链接(https://svn.boost.org/trac/boost/ticket/2615),因此我与libpython3.so应用程序进行了链接。但是,当我运行它时,出现了无法解析的符号错误。
ldd -r myapp或ldd -r libboost_python.so都列出了所有未解析的python符号,可以在中找到nm -D libpython3.5m.so。
# ldd -r lib/libboost_python3.so
linux-vdso.so.1 => (0x00007ffe767fb000)
libstdc+.so.6 => /usr/lib/x86_64-linux-gnu/libstdc+.so.6 (0x00007f130a7a3000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f130a58d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f130a1c8000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1309ec2000)
/lib64/ld-linux-x86-64.so.2 (0x00007f130acf4000)
undefined symbol: PyExc_ImportError (lib/libboost_python3.so)
undefined symbol: PyProperty_Type (lib/libboost_python3.so)
undefined symbol: PyExc_StopIteration (lib/libboost_python3.so)
undefined symbol: PyBool_Type (lib/libboost_python3.so)
undefined symbol: PyExc_ValueError (lib/libboost_python3.so)
undefined symbol: PyList_Type (lib/libboost_python3.so)
undefined symbol: _Py_NotImplementedStruct …Run Code Online (Sandbox Code Playgroud) 我正在使用Boost Python来使C++和Python一起运行,我有一个看起来像这样的代码,创建一个python对象的实例并调用它的一个成员函数.
bp::object myInstance;
// ... myInstance is initialized
bp::object fun = myInstance.attr("myfunction");
fun();
Run Code Online (Sandbox Code Playgroud)
我想在调用之前检查成员函数是否存在.如果它不存在,我不想打电话.
问题是:即使函数不存在,对myInstance.attr("myfunction")的调用也会成功.因此,测试函数是否存在于当前代码中的唯一方法是尝试调用它并捕获异常.
有没有办法检查函数是否存在而不涉及异常或调用函数?
我目前有一个boost.python类,用于从basler摄像机获取图像,将它们转换为opencv图像,并将它们作为numpy数组返回给python脚本。
我最初有以下有效的代码:
PyObject *capture()
{
PyObject * ret;
CGrabResultPtr ptrGrabResult;
CPylonImage pylonImage;
Mat image;
//timer t;
try
{
// Set timer to 0
//t.reset();
// get a pointer to pylon image
camera->RetrieveResult( 50000, ptrGrabResult, TimeoutHandling_ThrowException);
// Get dimensions of image
int imageWidthPixels = ptrGrabResult->GetWidth();
int imageHeightPixels = ptrGrabResult->GetHeight();
if (ptrGrabResult->GrabSucceeded())
{
// Convert Grab result from YUV422 to BGR8
formatConverter->Convert(pylonImage, ptrGrabResult);
// Convert pylon image to opencv image
image = Mat(imageHeightPixels, imageWidthPixels, CV_8UC3, (std::uint8_t *) pylonImage.GetBuffer());
// Convert opencv image …Run Code Online (Sandbox Code Playgroud)