标签: boost-python

CPython,IronPython,Jython脚本是否相互兼容?

我很确定python脚本可以在所有三个中运行,但我想确定.我已经在这里和那里阅读过可以编写CPython,Jython,IronPython的编辑,我希望我能够深入了解这一区别.

我的情况是我有3种不同的api,我想测试.每个api执行相同的功能代码,但它们在实现上是不同的.我正在为每种语言的api编写包装器.每个包装器都应该使用Boost :: python,Jython和IronPython向python公开完全相同的功能和实现.

我的问题是,使用这些公开的方法编写的python脚本(每种语言都很常见)是否适用于Python的所有三种"风格"?

就像我说的那样,我很确定答案是'当然',但我需要确保在花费太多时间进行研究之前.

python testing ironpython jython boost-python

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

Mac OS X上的Boost.Python:"TypeError:属性名称必须是字符串"

我最近使用MacPorts安装了Boost,意图在C++中进行一些Python嵌入.然后,我决定使用Python网站上的示例检查我是否正确配置了Xcode:

#include <boost/python.hpp>

using namespace boost::python;

int main( int argc, char ** argv ) 
{
    try 
    {
        Py_Initialize();

        object main_module(handle<>(borrowed(PyImport_AddModule("__main__"))));

        object main_namespace = main_module.attr("__dict__");

        handle<> ignored(PyRun_String("print \"Hello, World\"",
                                      Py_file_input,
                                      main_namespace.ptr(),
                                      main_namespace.ptr()));
    } 
    catch( error_already_set ) 
    {
        PyErr_Print();
    }
}
Run Code Online (Sandbox Code Playgroud)

它正确编译,但是当我启动它时,对attr()的调用会抛出异常,并且生成的错误消息是"TypeError:属性名称必须是字符串,而不是'str'".哪个可疑听起来像一个占位符.

我在Google上查了一下,但没有运气.

我在Leopard上使用Boost v1.39,Python 2.5和GCC 4.0.

c++ python boost-python

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

使用Boost.python将Python列表传递给C++向量

如何将我的对象类型的Python列表传递给ClassName接受vector<ClassName>?的C++函数?

我找到的最好的是这样的:例子.不幸的是,代码崩溃了,我似乎无法弄清楚原因.这是我用过的东西:

template<typename T>
void python_to_vector(boost::python::object o, vector<T>* v) {
    try {
      object iter_obj = object(handle<>(PyObject_GetIter(o.ptr())));
      return;
      for (;;) {
          object obj = extract<object>(iter_obj.attr("next")());
          // Should launch an exception if it cannot extract T
          v->emplace_back(extract<T>(obj));
      }
    } catch(error_already_set) {
        PyErr_Clear();
        // If there is an exception (no iterator, extract failed or end of the
        // list reached), clear it and exit the function
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

python vector boost-python

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

提升Python和shared_ptr的向量

我已经阅读了如何在boost python中将普通向量暴露给python,但我想知道如何公开和使用向量.例如,我有一个shared_ptrs向量,如下所示:

std::vector<shared_ptr<StatusEffect> > Effects;
Run Code Online (Sandbox Code Playgroud)

基于暴露向量的材料,我应该能够暴露这种类.我想知道的是我怎样才能真正添加​​它?如何创建实例,shared_ptr<StatusEffect>因为我无权访问new,而shared_ptr可以指向多个派生类型,这使得为每个类添加静态创建方法有点乏味.

有没有人有一些指示或可以建议如何做到这一点?为我想做的事情找到boost :: python的好例子已经变得非常棘手了

提前致谢

c++ boost-python

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

boost :: python :: list length

有没有办法计算从python传递到C++的列表长度?我想做这样的事情,但列表类缺少length(或任何类似的)方法:

class Awesome{
  public:
    void awesomeMethod(const boost::python::list& list_of_something){
      list_of_something.length() // suprisingly there's no such method
    } 
};
Run Code Online (Sandbox Code Playgroud)

c++ boost list boost-python

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

如何从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
查看次数

从python运行c ++代码

我想执行一个代码helloword.cpp,它从控制台接受一些参数解析那些参数,然后在控制台中打印"hello world".

现在,我想从python脚本parsearguments.py中解析这些参数

例如:

def parse_arguments:
  ...# some code
  return arguments
Run Code Online (Sandbox Code Playgroud)

现在,我如何在python和c ++之间进行通信.我一直在阅读并看到cython,boost python是选项,但我很难找到正确的简单hello世界示例.

任何建议将不胜感激.谢谢

c++ python ctypes cython boost-python

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

使用Boost-Python计算python中定义的函数的导数

我想编写一个Boost-Python程序来从用户那里获取一个符号python函数,并在我的程序中评估它的派生.

例如,User提供了一个python文件(Function.py),它定义了一个类似F = sin(x)*cos(x)的函数.

然后我希望使用Sympy的符号分化能力来访问F'(x)(F(x)的导数).我不想使用数值微分.

有没有办法使用Boost-Python在C++中访问这样的函数F'(x).

c++ python numpy sympy boost-python

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

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

我想用C++ 11 lambda表达式作为访问功能boost::pythonadd_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 __init __()应该返回None,而不是'NoneType'

我有一大堆工作的C++代码,我想编写Python绑定.我正在尝试使用Boost.Python,因为它似乎是让这个工作最简单的方法,但它不合作.这是我正在尝试构建的扩展模块的代码的一部分:

BOOST_PYTHON_MODULE(libpcap_ext) {
    using namespace boost::python;
    class_<PacketEngine>("PacketEngine")
        .def("getAvailableDevices", &PacketEngine_getAvailableDevices);
}
Run Code Online (Sandbox Code Playgroud)

Bjam似乎很痛苦并拒绝识别我的Pythonpath或允许我链接libpcap,所以我正在使用CMake.这是我的CMakeLists文件,可以导入和构建一切就好(按预期输出libpcap.so):

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
IF(NOT CMAKE_BUILD_TYPE)
  SET(CMAKE_BUILD_TYPE "DEBUG")
  #SET(CMAKE_BUILD_TYPE "RELEASE")
  #SET(CMAKE_BUILD_TYPE "RELWITHDEBINFO")
  #SET(CMAKE_BUILD_TYPE "MINSIZEREL")
ENDIF()

FIND_PACKAGE(Boost 1.55.0)
find_package(PythonLibs REQUIRED)
IF(Boost_FOUND)
  INCLUDE_DIRECTORIES("${Boost_INCLUDE_DIRS}" "${PYTHON_INCLUDE_DIRS}")
  SET(Boost_USE_STATIC_LIBS OFF)
  SET(Boost_USE_MULTITHREADED ON)
  SET(Boost_USE_STATIC_RUNTIME OFF)
  FIND_PACKAGE(Boost 1.55.0 COMPONENTS python)

  ADD_LIBRARY(pcap_ext MODULE PacketWarrior/pcap_ext.cc PacketWarrior/PacketEngine.h PacketWarrior/PacketEngine.cc PacketWarrior/Packet.h PacketWarrior/Packet.cc)
  TARGET_LINK_LIBRARIES(pcap_ext pcap)
  TARGET_LINK_LIBRARIES(pcap_ext ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
ELSEIF(NOT Boost_FOUND)
  MESSAGE(FATAL_ERROR "Unable to find correct Boost version. Did you set BOOST_ROOT?")
ENDIF()

ADD_DEFINITIONS("-Wall")
Run Code Online (Sandbox Code Playgroud)

我的pcap.py文件试图利用该模块:

import libpcap_ext
engine = libpcap_ext.PacketEngine()
print engine.getAvailableDevices()
Run Code Online (Sandbox Code Playgroud)

但每当我尝试运行该模块时,我都会收到以下错误:

Traceback (most recent …
Run Code Online (Sandbox Code Playgroud)

boost-build boost-python

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

标签 统计

boost-python ×10

c++ ×7

python ×6

boost ×2

boost-build ×1

c++11 ×1

ctypes ×1

cython ×1

import ×1

ironpython ×1

jython ×1

lambda ×1

list ×1

numpy ×1

sympy ×1

testing ×1

vector ×1