问题标签 [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.

0 投票
2 回答
1405 浏览

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 对两只小猫喵喵叫!然而,仍然没有完全存在,因为现在我明白了:

所以还是在寻求帮助!谢谢!

0 投票
1 回答
3035 浏览

python - Python c-api 和 unicode 字符串

我需要在 python 对象和各种编码的 c 字符串之间进行转换。使用 PyUnicode_Decode 从 ac 字符串到 unicode 对象非常简单,但是我不知道如何走另一条路

我想创建另一个函数,该函数采用 python Unicode 字符串并使用给定的编码将其放入缓冲区中,例如:

我怀疑它与 PyUnicode_AsEncodedString 有关系,但是它返回一个 PyObject 所以我不知道如何把它放到我的缓冲区中......

注意:以上两种方法都是 c++ Unicode 类的成员,该类包装了我正在使用 Python 3.0 的 python api

0 投票
2 回答
6074 浏览

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 在同一个对象上被多次调用,我是否应该有一些引发异常或其他东西的标志?

除此之外,我想我已经把剩下的大部分都整理好了。

0 投票
2 回答
2482 浏览

python - 有什么方法可以使用 C API 创建 NumPy 矩阵?

我阅读了我能找到的关于 NumPy C API 的文档,但仍然无法确定是否有可能使用 C API 构造矩阵对象——而不是二维数组。该函数适用于数学矩阵,如果用户调用矩阵乘法时忘记将此值从数组转换为矩阵(乘法和求幂是矩阵子类的唯一区别),我不想要奇怪的结果。

0 投票
3 回答
1136 浏览

python - Python C-API 对象初始化

将python对象初始化到已经存在的内存中的正确方法是什么(如c ++中的就地新)

我尝试了此代码,但是由于未设置 _ob_prev 和 _ob_next ,因此它会导致调试版本出现访问冲突。

崩溃发生在 object.c 的第 1519 行

0 投票
2 回答
3474 浏览

python - Python 3 C API 中的文件 I/O

Python 3.0 中的 C API 已更改(弃用)文件对象的许多函数。

之前,在 2.X 中,您可以使用

创建一个 Python 文件对象,例如:

...但是这样的功能在 Python 3.0 中不再存在。与这种调用等效的 Python 3.0 是什么?

0 投票
1 回答
214 浏览

python - Python 扩展返回对象礼仪

我正在编写一个 python 扩展来提供对 Solaris kstat 数据的访问(本着与运送 perl 库 Sun::Solaris::Kstat 相同的精神),我有一个关于有条件地返回列表或单个对象的问题。python 用例看起来像:

由于它目前已实现,lookup() 返回匹配的所有 kstat 对象的列表。第一种情况会产生一个对象列表(与 CPU 一样多),第二种调用完全指定一个 kstat 并返回一个包含一个 kstat 的列表。

我的问题是,当只有一个匹配时返回单个对象,而当有很多匹配时返回列表?

谢谢你周到的回答!由于像你这样的人,我的python-fu很弱,但正在变得更强大。

0 投票
1 回答
4709 浏览

python - Python C API:如何获取异常的字符串表示?

如果我这样做(例如)

在 Python 中(并且该文件不存在),我得到一个回溯和消息

我想用 Python 的 C API(即嵌入在 C 程序中的 Python 解释器)来获取上述字符串。我需要它作为字符串,而不是输出到控制台。

有了PyErr_Fetch()我可以得到异常的类型对象和值。对于上面的示例,该值是一个元组:

从我得到的信息PyErr_Fetch()到 Python 解释器显示的字符串有没有简单的方法?(不涉及自己为每种异常类型构造此类字符串。)

0 投票
1 回答
1097 浏览

python - 访问核心转储中的 Python 对象

无论如何从 gdb 中的核心文件中发现 PyObject* 的 python 值

0 投票
2 回答
2598 浏览

python - Python C 扩展:文档的方法签名?

我正在编写 C 扩展,我想让我的方法的签名可见以进行自省。

现在如果(在构建它之后......)我加载模块并查看它的帮助:

我会得到:

我想更具体一点,并且能够用foo (timeout, flags=None)替换foo(... )

我可以这样做吗?如何?