问题标签 [python-c-api]
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.
python - 使用 PyCxx 创建可继承的 Python 类型
我和一个朋友最近一直在玩弄各种 Python C++ 包装器,试图找到一个同时满足一些专业和业余项目需求的包装器。我们都在PyCxx上进行了磨练,作为轻量级和易于交互之间的良好平衡,同时隐藏了 Python C api 的一些最丑陋的部分。然而,PyCxx 在公开类型方面并不是非常健壮(即:它指示您创建类型工厂而不是实现构造函数),我们一直在努力填补空白,以便以更实用的方式公开我们的类型. 为了填补这些空白,我们求助于 C api。
然而,这给我们留下了一些问题,api 文档似乎没有深入介绍(当它涵盖时,答案有时是矛盾的)。基本的总体问题很简单:必须为 Python 类型定义什么才能用作基本类型?我们发现,要使 PyCxx 类作为类型起作用,我们需要显式定义 tp_new 和 tp_dealloc 并将类型设置为模块属性,并且我们需要在 [我们的类型]->tp_flags 上设置 Py_TPFLAGS_BASETYPE,但超出我们仍在黑暗中摸索。
到目前为止,这是我们的代码:
我们的 Python 测试代码如下所示:
奇怪的是,如果您将所有 meanKitty 位注释掉,脚本就会运行并且猫会喵喵叫,但是如果您取消对 meanKitty 类的注释,Python 会突然给我们这个:
这让我很困惑。就好像从它继承完全隐藏了基类!如果有人可以对我们缺少的内容提供一些见解,我们将不胜感激!谢谢!
编辑:好的,所以在发布这篇文章大约五秒钟后,我想起了我们之前想尝试的东西。我将以下代码添加到 kitty -
现在我们正在用 Python 对两只小猫喵喵叫!然而,仍然没有完全存在,因为现在我明白了:
所以还是在寻求帮助!谢谢!
python - Python c-api 和 unicode 字符串
我需要在 python 对象和各种编码的 c 字符串之间进行转换。使用 PyUnicode_Decode 从 ac 字符串到 unicode 对象非常简单,但是我不知道如何走另一条路
我想创建另一个函数,该函数采用 python Unicode 字符串并使用给定的编码将其放入缓冲区中,例如:
我怀疑它与 PyUnicode_AsEncodedString 有关系,但是它返回一个 PyObject 所以我不知道如何把它放到我的缓冲区中......
注意:以上两种方法都是 c++ Unicode 类的成员,该类包装了我正在使用 Python 3.0 的 python api
c++ - Python C-API 对象分配
我想使用 new 和 delete 运算符来创建和销毁我的对象。
问题是python似乎把它分成了几个阶段。tp_new、tp_init 和 tp_alloc 用于创建,tp_del、tp_free 和 tp_dealloc 用于销毁。然而 c++ 只有 new 分配和完全构造对象和 delete 破坏和释放对象。
我需要提供哪些 python tp_* 方法,它们必须做什么?
我还希望能够直接在 C++ 中创建对象,例如“PyObject *obj = new MyExtensionObject(args);” 我是否还需要以某种方式重载 new 运算符来支持这一点?
我也希望能够在 python 中对我的扩展类型进行子类化,我需要做些什么来支持这一点吗?
我正在使用 python 3.0.1。
编辑:好的,tp_init 似乎使对象对于我正在做的事情来说有点太可变了(例如,获取一个 Texture 对象,在创建后更改内容很好,但是更改它的基本方面,例如大小、bitdept 等会破坏许多现有的 c++ 东西都假设这些东西是固定的)。如果我不实现它,它只会阻止人们在构造后调用 __init__ (或者至少忽略调用,就像元组一样)。或者,如果 tp_init 在同一个对象上被多次调用,我是否应该有一些引发异常或其他东西的标志?
除此之外,我想我已经把剩下的大部分都整理好了。
python - 有什么方法可以使用 C API 创建 NumPy 矩阵?
我阅读了我能找到的关于 NumPy C API 的文档,但仍然无法确定是否有可能使用 C API 构造矩阵对象——而不是二维数组。该函数适用于数学矩阵,如果用户调用矩阵乘法时忘记将此值从数组转换为矩阵(乘法和求幂是矩阵子类的唯一区别),我不想要奇怪的结果。
python - Python C-API 对象初始化
将python对象初始化到已经存在的内存中的正确方法是什么(如c ++中的就地新)
我尝试了此代码,但是由于未设置 _ob_prev 和 _ob_next ,因此它会导致调试版本出现访问冲突。
崩溃发生在 object.c 的第 1519 行
python - Python 3 C API 中的文件 I/O
Python 3.0 中的 C API 已更改(弃用)文件对象的许多函数。
之前,在 2.X 中,您可以使用
创建一个 Python 文件对象,例如:
...但是这样的功能在 Python 3.0 中不再存在。与这种调用等效的 Python 3.0 是什么?
python - Python 扩展返回对象礼仪
我正在编写一个 python 扩展来提供对 Solaris kstat 数据的访问(本着与运送 perl 库 Sun::Solaris::Kstat 相同的精神),我有一个关于有条件地返回列表或单个对象的问题。python 用例看起来像:
由于它目前已实现,lookup() 返回匹配的所有 kstat 对象的列表。第一种情况会产生一个对象列表(与 CPU 一样多),第二种调用完全指定一个 kstat 并返回一个包含一个 kstat 的列表。
我的问题是,当只有一个匹配时返回单个对象,而当有很多匹配时返回列表?
谢谢你周到的回答!由于像你这样的人,我的python-fu很弱,但正在变得更强大。
python - Python C API:如何获取异常的字符串表示?
如果我这样做(例如)
在 Python 中(并且该文件不存在),我得到一个回溯和消息
我想用 Python 的 C API(即嵌入在 C 程序中的 Python 解释器)来获取上述字符串。我需要它作为字符串,而不是输出到控制台。
有了PyErr_Fetch()
我可以得到异常的类型对象和值。对于上面的示例,该值是一个元组:
从我得到的信息PyErr_Fetch()
到 Python 解释器显示的字符串有没有简单的方法?(不涉及自己为每种异常类型构造此类字符串。)
python - 访问核心转储中的 Python 对象
无论如何从 gdb 中的核心文件中发现 PyObject* 的 python 值
python - Python C 扩展:文档的方法签名?
我正在编写 C 扩展,我想让我的方法的签名可见以进行自省。
现在如果(在构建它之后......)我加载模块并查看它的帮助:
我会得到:
我想更具体一点,并且能够用foo (timeout, flags=None)替换foo(... )
我可以这样做吗?如何?