我很确定python脚本可以在所有三个中运行,但我想确定.我已经在这里和那里阅读过可以编写CPython,Jython,IronPython的编辑,我希望我能够深入了解这一区别.
我的情况是我有3种不同的api,我想测试.每个api执行相同的功能代码,但它们在实现上是不同的.我正在为每种语言的api编写包装器.每个包装器都应该使用Boost :: python,Jython和IronPython向python公开完全相同的功能和实现.
我的问题是,使用这些公开的方法编写的python脚本(每种语言都很常见)是否适用于Python的所有三种"风格"?
就像我说的那样,我很确定答案是'当然',但我需要确保在花费太多时间进行研究之前.
我最近使用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.
如何将我的对象类型的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) 我已经阅读了如何在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的好例子已经变得非常棘手了
提前致谢
有没有办法计算从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) 我正在使用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) 我想执行一个代码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世界示例.
任何建议将不胜感激.谢谢
我想编写一个Boost-Python程序来从用户那里获取一个符号python函数,并在我的程序中评估它的派生.
例如,User提供了一个python文件(Function.py),它定义了一个类似F = sin(x)*cos(x)的函数.
然后我希望使用Sympy的符号分化能力来访问F'(x)(F(x)的导数).我不想使用数值微分.
有没有办法使用Boost-Python在C++中访问这样的函数F'(x).
我想用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++代码,我想编写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)