我想知道是否有任何方法可以将C ++类公开给Python,但无需构建中间共享库。
这是我理想的情况。例如,我有以下C ++类:
class toto
{
public:
toto(int iValue1_, int iValue2_): iValue1(iValue1_), iValue2(iValue2_) {}
int Addition(void) const {if (!this) return 0; return iValue1 + iValue2;}
private:
int iValue1;
int iValue2;
};
我想以某种方式将此类(或其实例)转换为PyObject *,以便将其作为参数(参数)发送给例如PyObject_CallObject:
PyObject* PyObject_CallObject(PyObject* wrapperFunction, PyObject* args)
另一方面,在python端,我有一个wrapperFunction,它将我的C ++类(或其实例)上的指针作为参数,并调用其方法或使用其属性:
def wrapper_function(cPlusPlusClass):
instance = cPlusPlusClass(4, 5)
result = instance.Addition()
如您所见,我并不需要/不想拥有单独的共享库或通过boost python构建模块。我需要做的就是找到一种将C
++代码转换为PyObject并将其发送给python的方法。我找不到通过C python库,boost或SWIG做到这一点的方法。
你有什么主意吗?谢谢你的帮助。
我找到了答案。实际上,我正在搜索的内容与此答案非常相似(感谢moooeeeep的评论):
将C
++类实例暴露给python嵌入式解释器
遵循C ++类(注意!默认构造函数是必需的):
class TwoValues
{
public:
TwoValues(void): iValue1(0), iValue2(0) {}
TwoValues(int iValue1, int iValue2): iValue1(iValue1_), iValue2(iValue2_) {}
int Addition(void) const {if (!this) return 0; return iValue1 + iValue2;}
public:
int iValue1;
int iValue2;
};
可以通过以下宏通过增强来暴露:
BOOST_PYTHON_MODULE(ModuleTestBoost)
{
class_<TwoValues>("TwoValues")
.def("Addition", &TWOVALUES::Addition)
.add_property("Value1", &TWOVALUES::iValue1)
.add_property("Value2", &TWOVALUES::iValue2);
};
另一方面,我定义了一个python函数,python_script.py
该函数接受此类的实例并执行某些操作。例如:
def wrapper_function(instance):
result = instance.Addition()
myfile = open(r"C:\...\testboostexample.txt", "w")
output = 'First variable is {0}, second variable is {1} and finally the addition is {2}'.format(instance.Value1, instance.Value2, result)
myfile .write(output)
myfile .close()
然后在C ++端,我可以通过同时发送类的实例来调用此函数,如下所示:
Py_Initialize();
try
{
TwoValues instance(5, 10);
initModuleTestBoost();
object python_script = import("python_script");
object wrapper_function = python_script.attr("wrapper_function");
wrapper_function(&instance);
}
catch (error_already_set)
{
PyErr_Print();
}
Py_Finalize();
优点:
问题内容: 我在Maven项目中有一个父POM,具有以下结构: 我想在本地REPO中安装 “父” 的POM,以允许 child1 进行我在dependencyManagement中所做的一些更改,但是由于 “ child2” 已损坏并且无法构建,因此 我无法进行常规的 “全新 安装” 。 这是使用Maven执行此操作的正确方法(除了转到父pom并注释 “ child2” 模块之外)。 问题答案:
问题内容: 我是Python的新手,正在尝试安装此模块:http : //www.catonmat.net/blog/python-library-for-google- search/ 目录中没有setup.py,但是有以下文件: 有人可以告诉我如何设置或使用此模块吗? 谢谢! 问题答案: 在系统上开始使用该代码的最简单方法是: 将文件放入计算机上的目录中, 将该目录的路径添加到您的PYTHON
[ERROR]无法执行goal org.springframework.boot:spring-boot-maven-plugin:2.1.1。release:repackage(repackage)on project project-data:goal org.springframework.boot:spring-boot-maven-plugin:2.1.1。release:repacka
问题内容: 我已经看到了几种通过首先导入来查找模块路径的方法。有没有一种方法,而无需导入模块? 问题答案: 使用pkgutil模块: 使用imp模块: 注意:使用imp模块,您 无法 做类似的事情
问题内容: 在另一个问题中,我学习了如何通过复制对象来公开将C++对象返回给Python的函数。必须执行复制似乎不是最佳选择。如何不复制就返回对象?即如何直接访问in中返回的峰(在peak_detection_.pyx 中定义)? peak_detection.hpp peak_detection.cpp 峰值 peak_detection_.pyx 问题答案: 如果您拥有现代的C ++编译器并且
问题内容: 我目前正在研究一个项目,因为我必须用Python包装C ++类才能编写程序脚本。因此,我的具体经验还涉及将Python解释器嵌入到我们的程序中。 我尝试的替代方法是: Boost.Python 我喜欢Boost.Python生成的更清洁的API,但事实是它需要用户安装其他依赖项,这一事实使我们切换到SWIG。 斯威格 SWIG对我们而言的主要优势在于,它不需要最终用户安装它即可使用最终