问题标签 [pycxx]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
403 浏览

c++ - 如何整理/修复 PyCXX 创建的新型 Python 扩展类?

我几乎完成了对 C++ Python 包装器 (PyCXX) 的重写。

原始允许新旧样式扩展类,但也允许从新样式类派生:

代码很复杂,并且似乎包含错误(为什么 PyCXX 以它的方式处理新型类?

我的问题是:PyCXX 复杂机制的基本原理/理由是什么?有没有更清洁的替代品?

我将尝试在下面详细说明我在此查询中所处的位置。首先,我将尝试描述 PyCXX 目前正在做什么,然后我将描述我认为可能需要改进的地方。


当 Python 运行时遇到 时d = Derived(),它会执行PyObject_Call( ob ) where ob is thePyTypeObject forNewStyleClass . I will writeob asNewStyleClass_PyTypeObject`。

PyTypeObject 已经用 C++ 构建并使用PyType_Ready

PyObject_Call将调用type_call(PyTypeObject *type, PyObject *args, PyObject *kwds),返回一个初始化的派生实例,即

像这样的东西。

(所有这些都来自(顺便说一下, http ://eli.thegreenplace.net/2012/04/16/python-object-creation-sequence,谢谢 Eli!)

type_call 本质上是:

我们的 C++ 包装器已将函数插入到类似这样的东西的tp_newtp_init槽中:NewStyleClass_PyTypeObject

请注意,我们需要将 Python Derived 实例绑定在一起,它是对应的 C++ 类实例。(为什么?解释如下,见“X”)。为此,我们使用:

现在这座桥提出了一个问题。我非常怀疑这种设计。

请注意如何为这个新的 PyObject 分配内存:

然后我们将 this 指针类型转换为,并使用紧随其后Bridge的 4 或 8 ( ) 个字节指向相应的 C++ 类实例(如上所示,这被连接起来了)。sizeof(void*)PyObjectextension_object_init

现在要让它工作,我们需要:

a)subtype->tp_alloc(subtype,0)必须分配一个额外的sizeof(void*)字节 b)PyObject不需要任何超出 的内存sizeof(PyObject_HEAD),因为如果它这样做了,那么这将与上述指针冲突

在这一点上我的一个主要问题是:我们能否保证PyObjectPython 运行时为我们创建的derived_instance不会与 Bridge 的ExtObjBase* m_pycxx_object字段重叠?

我将尝试回答:由美国决定分配多少内存。当我们创建时,我们输入我们希望为这种类型的新实例分配NewStyleClass_PyTypeObject多少内存:PyTypeObject

你可以看到它进入table->tp_basicsize

但现在我似乎很清楚,从中生成的 PyObject-sNewStyleClass_PyTypeObject永远不需要额外分配的内存。

这意味着整个Bridge机制是不必要的。

PyCXX 的原始技术使用 PyObject 作为 的基类NewStyleClassCXXClass,并初始化这个基类,以便 Python 运行时的 PyObjectd = Derived()实际上是这个基类,这种技术看起来不错。因为它允许无缝类型转换。

每当 Python 运行时NewStyleClass_PyTypeObjectNewStyleClassCXXClass. <-- 'X'(上面引用过)

所以真的我的问题是:我们为什么不这样做呢?从强制为 PyObject 进行额外分配的派生有什么特别之处NewStyleClass吗?

我意识到我不理解派生类的创建顺序。伊莱的帖子没有涵盖这一点。

我怀疑这可能与以下事实有关

^ 这个变量名是'subtype' 我不明白这个,我想知道这是否可能是关键。

编辑:我想到了为什么 PyCXX 使用 sizeof(FinalClass) 进行初始化的一种可能解释。它可能是一个经过尝试和放弃的想法的遗物。即,如果 Python 的 tp_new 调用为 FinalClass(它以 PyObject 作为基础)分配了足够的空间,也许可以使用“placement new”或一些巧妙的 reinterpret_cast 业务在该确切位置生成一个新的 FinalClass。我的猜测是这可能已经尝试过了,发现会造成一些问题,解决了问题,然后遗物就被抛在了后面。

0 投票
1 回答
1165 浏览

c++ - {tp_alloc, tp_dealloc} 和 {tp_new, tp_free} 应该被视为对吗?

tp_alloc 中创建的任何东西都应该在 tp_dealloc 中销毁,这是真的吗?同样对于 {tp_new, tp_free}?

它看起来像一个明显的对称性,但我会很感激澄清。


我的实际用例是这样的:我有:

所以对应的PyTypeObject pto有:

但是,新样式类将 PyObject 及其对应的 C++ 对象彼此分开存储,因此工作方式不同。

它在 tp_new 中创建 PyObject,并在 tp_init 中创建相应的 C++ 对象。

并在 tp_dealloc 中销毁它们

这是正确/最佳的吗?

代码:

0 投票
1 回答
301 浏览

python - 调试我的 Python C 扩展会导致“PyThreadState_Get:没有当前线程”

当我使用 Visual Studio 调试我的 Python C 扩展时,程序中止并显示以下消息:“PyThreadState_Get:没有当前线程”。

在 Release 中,程序运行良好,如果我添加调试信息,它仍然运行良好。

如何解决问题?

0 投票
0 回答
134 浏览

python - python pycxx第一个测试用例构建错误

尝试使用 pycxx。

使用:python 3.5 64 位,windows 7 64 位,pycxx 6.2.8

写了一个简单的cxx文件来测试一下。

但构建有错误,试图搜索解决方案但失败

aaa.cxx 为:

setup.py 为:

使用“python setup.py install”构建,但出现错误: 构建错误

非常感谢您提前提供的帮助。

0 投票
0 回答
209 浏览

python-2.7 - PyCX 模拟器 GUI 中没有显示可点击的“运行”/“步骤”按钮

所有代码都可以在没有错误消息的情况下运行,但 pycxsimulator GUI 不会生成可单击的选项卡或“运行”按钮来可视化模拟,即使该图确实显示了。

我认为这是 Tkinter 模块/“Tk 接口”/Tk GUI for python 的后端问题(我一直有,并且不得不从 Python 3.5 降级到 2.7)。

问题截图。使用:MacOS High Sierra 10.13.3 在 2017 年中期的基线 MacBook 上,使用 Anaconda 安装的 Python 2.7,Spyder 3.0.0 界面,标准 PyCX 0.32 文件夹中的任何标准模型。 截屏

0 投票
0 回答
26 浏览

python - 如何使用 PyCxx 将图像文件从 python 写入 C++

我希望能够使用 PyCxx 将 Python(或任何二进制文件)中的图像写入 C++,并让 C++ 层将其写入文件。我在 PyCXX 中找不到任何可以启用此功能的二进制类型 - 最接近的是 Py::Bytes 似乎基于 'char' 类型。

有什么想法/建议吗?

感谢你的帮助!