我正在研究一个c ++项目,最近我们需要在其中加入一小部分的提升.增强部分实际上是最小的(Boost :: Python),因此,使用bjam来构建一切看起来像是一种矫枉过正(此外,每个参与该项目的人都对制作感觉很舒服,而且没有堵塞的知识).
我已经做了很多测试,但是我找不到一种方法来在我的makefile中包含以前提到的库并使构建成功.
你所有的帮助都是非常苛刻的.:)
当解释器是C并且使用C编译器构建时,Python如何能够调用C++对象?
我只是想编译boost.python的"hello world"示例而不使用所有的bjam魔法.我的boost.python安装工作正常,我用bjam成功构建了示例并通过了测试套件.
现在,对于我的项目,我需要在普通的Make环境中使用所有这些东西.我不想移植到另一个构建工具.
所以我的天真方法当然只是将包含路径指向正确的标题并链接到正确的库.我将boost python构建为system-layout,static,runtime-static,这意味着它只是一个驻留在/ usr/local/lib中的libboost_python.a.
不幸的是,我在生成的.so库中得到了未解析的外部符号.
这是我尝试从libs/python/example/tutorial/hello.cpp构建示例:
$ cat hello.cpp
// Copyright Joel de Guzman 2002-2004. Distributed under the Boost
// Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt
// or copy at http://www.boost.org/LICENSE_1_0.txt)
// Hello World Example from the tutorial
// [Joel de Guzman 10/9/2002]
#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);
}
$ g++ -I/usr/local/include -I/usr/include/python -fpic -c -o hello.o
hello.cpp
$ g++ -shared -Wl,-soname,"libhello.so" …Run Code Online (Sandbox Code Playgroud) 我有一堆用C++编写的类和API,并在Boost.Python的帮助下暴露给Python
我目前正在研究创建以下架构的可能性.
在python中:
from boostPythonModule import *
AddFunction( boostPythonObject.Method1, args )
AddFunction( boostPythonObject.Method2, args )
AddFunction( boostPythonObject.Method2, args )
RunAll( ) # running is done by C++
Run Code Online (Sandbox Code Playgroud)
在C++中:
void AddFunction( boost::object method, boost::object args )
{
/// 1. Here i need to extract a real pointer to a function
/// 2. Make argument and type checking for a function under method
/// 3. Unpack all arguments to native types
/// 4. Store the pointer to a function somewhere in local …Run Code Online (Sandbox Code Playgroud) 我正在尝试测试多线程C++ DLL.这个DLL应该是线程安全的.我用boost.python包装它,我想创建多个python线程来通过boost.python包装器来运行DLL.我实际上是在试图引起线程问题.
我似乎无法找到好的文档是python解释器是否支持它的两个线程(比如说在不同的核心上)同时调用一个导入的模块,以及GIL是否需要根据我不需要管理希望任何增加的安全性高于DLL应该提供的安全性.
任何人都可以描述或引用我从多个线程调用DLL模块的python的描述以及如何在这种情况下使用GIL吗?
我想知道什么版本的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) 我有一个struct包含C风格的数组数据成员.我想将这个结构体暴露给Python,并且这个数据成员可以作为Python中的列表访问.
struct S
{
char arr[4128];
};
void foo( S const * )
{}
BOOST_PYTHON_MODULE( test )
{
using namespace boost::python;
class_<S>( "S" )
.def_readwrite( "arr", &S::arr )
;
def( "foo", foo );
}
Run Code Online (Sandbox Code Playgroud)
上面的代码无法构建
error C2440: '=' : cannot convert from 'const char [4128]' to 'char [4128]'
Run Code Online (Sandbox Code Playgroud)
C风格的数组不可分配,因此错误很有意义.如果我将数据成员更改为普通char而不是数组,则代码将编译.
我无法用一个std::array或其他容器替换该数组,因为该结构正由C API使用.我能想到的唯一解决方案是编写几个包装器并执行以下操作
struct S1重复的,S除了它将有一个std::array而不是一个C风格的数组foo_wrapper接受a的A ,S1 const *将内容复制到S实例并调用footo_python_converter转换std::array为Python列表 …我正在尝试在MacOSX Yosemite上安装PyFTGL.
我使用的python版本是来自macports的2.7.我从macports安装了boost + python27.
要安装从源代码构建的PyFTGL,并从以下位置编辑setup.py文件:
module_ftgl_libs = [
'GLU',
'GL',
'freetype',
'z',
'ftgl',
'boost_python',
]
module_ftgl = Extension(
'FTGL',
module_ftgl_src,
include_dirs=module_ftgl_include_dirs,
libraries=module_ftgl_libs
)
Run Code Online (Sandbox Code Playgroud)
至:
module_ftgl_libs = [
'freetype',
'z',
'ftgl',
'boost_python',
]
module_ftgl = Extension(
'FTGL',
module_ftgl_src,
include_dirs=module_ftgl_include_dirs,
libraries=module_ftgl_libs,
extra_link_args=['-framework', 'OpenGL', '-framework', 'GLUT']
)
Run Code Online (Sandbox Code Playgroud)
然后我构建setup.py文件并将生成的FTGL.so文件复制到与使用FTGL函数的python代码test.py相同的文件夹中.
我的问题是,当我现在运行我的代码时,我收到以下错误:
Traceback (most recent call last):
File "test.py", line 29, in <module>
import FTGL
ImportError: dlopen(/Users/james/Desktop/test/FTGL.so, 2): Symbol not found:__ZN5boost6python7objects15function_objectERKNS1_11py_functionERKNSt3__14pairIPNS0_6detail7keywordESA_EE
Referenced from: /Users/james/Desktop/test/FTGL.so
Expected in: flat namespace
in /Users/james/Desktop/test/FTGL.so
Run Code Online (Sandbox Code Playgroud)
我不太了解链接,setup.py文件和提升,我花了很长时间研究Google和Stack Overflow,但现在我无法弄清楚问题.
我有一个用python编写的模块.这个模块是我在Python中实现的许多不同功能的接口:
EmbeddingInterface.py只是导入该模块并创建一个实例:
import CPPController
cppControllerInstance = CPPController()
Run Code Online (Sandbox Code Playgroud)
我想在c ++中使用cppControllerInstance.这是我到目前为止所做的:
#include <Python.h>
#include <boost\python.hpp>
using namespace boost;
python::object createController()
{
try
{
Py_Initialize();
python::object mainModule = python::import("__main__");
python::object mainNamespace = mainModule.attr("__dict__");
python::dict locals;
python::exec(
"print \"loading python implementetion:\"\n"
"import sys\n"
"sys.path.insert(0, \"C:\\Projects\\Python\\ProjectName\\Panda\")\n"
"import EmbeddingInterface\n"
"controller = EmbeddingInterface.cppControllerInstance\n",
mainNamespace, locals);
python::object controller = locals["controller"];
return controller;
}
catch(...) {}
}
Run Code Online (Sandbox Code Playgroud)
问题:
这个'控制器'有一些必须异步调用的函数.它的工作是连续的,此外它可以抛出异常.这就是为什么std :: async听起来很棒.
但它不起作用:
int main()
{
python::object controller = createController();
python::object loadScene = controller.attr("loadScene");
//loadScene(); // works OK but blocking! …Run Code Online (Sandbox Code Playgroud) 我用boost-python包装C++类,我想知道有没有比我现在做的更好的方法.
问题是这些类具有相同名称的getter/setter,并且似乎没有用boost-python包装它的无痛方法.
这是问题的简化版本.鉴于此类:
#include <boost/python.hpp>
using namespace boost::python;
class Foo {
public:
double
x() const
{
return _x;
}
void
x(const double new_x)
{
_x = new_x;
}
private:
double _x;
};
Run Code Online (Sandbox Code Playgroud)
我想做的事情如下:
BOOST_PYTHON_MODULE(foo)
{
class_<Foo>("Foo", init<>())
.add_property("x", &Foo::x, &Foo::x)
;
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为boost-python无法确定要使用的函数版本.
事实上,你甚至做不到
.def("x", &Foo::x)
Run Code Online (Sandbox Code Playgroud)
出于同样的原因.
我正在重新阅读boost.org上的教程,有关重载的部分似乎非常有前途.不幸的是,它似乎并不是我想要的.
在重载部分,它提到了一个BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS像这样工作的宏:
如果有另一个成员函数,则Foo使用默认参数:
void z(int i=42)
{
std::cout << i << "\n";
}
Run Code Online (Sandbox Code Playgroud)
然后你可以使用宏:
BOOST_PYTHON_MEMBER_FUNCTION_OVERLOADS(z_member_overloads, z, 0, 1)
Run Code Online (Sandbox Code Playgroud)
然后在BOOST_PYTHON_MODULE:
.def("z", &Foo::z, z_member_overloads())
Run Code Online (Sandbox Code Playgroud)
z_member_overloads …
boost-python ×10
python ×8
c++ ×6
boost ×3
makefile ×2
bjam ×1
c++11 ×1
ftgl ×1
importerror ×1
macos ×1