问题标签 [python-c-extension]

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 投票
3 回答
5499 浏览

python - 有什么理由在 PyMem_Malloc 上使用 malloc 吗?

我正在阅读Python C extensions 中的内存管理文档,据我所知,似乎没有太多理由使用malloc而不是PyMem_Malloc. 假设我想分配一个不会暴露给 Python 源代码并将存储在将被垃圾收集的对象中的数组。有什么理由使用malloc吗?

0 投票
3 回答
2866 浏览

python - 如何在 Cython 中创建一个固定长度、可变的 Python 对象数组?

我需要有一组 python 对象用于创建 trie 数据结构。我需要一个结构,它像元组一样是固定长度,像列表一样是可变的。我不想使用列表,因为我希望能够确保列表的大小完全正确(如果它开始分配额外的元素,那么随着 trie 变大,内存开销可能会很快增加)。有没有办法做到这一点?我尝试创建一个对象数组:

...但这给出了一个错误:

做我想做的事情的最佳方法是什么?

0 投票
1 回答
1059 浏览

python - 释放 PyTuple 对象

PyTuple使用 Python C-API释放对象的正确方法是什么?

我知道元组在引用计数语义方面有些特殊,因为PyTuple_SetItem窃取”了对插入元素的引用。我也知道减少元组对象的引用会减少元组中所有元素的引用计数。

考虑到这一点,我认为应该安全地说:

但是当我减少元组引用计数时,最后一行会导致分段错误。我不明白为什么会这样。就在调用Py_DECREF引用计数之前1,那么这里的问题是什么?

0 投票
1 回答
1582 浏览

python - 无法导入python扩展

我正在尝试学习 python 扩展,并创建了简单的noddy 示例c 文件和 setup.py。

python.exe setup.py build 给我:

然后我运行python.exe setup.py install,这给了我:

但是,在空闲时,

那么,我做错了什么?诚然,我非常困惑。

0 投票
2 回答
3998 浏览

python - 编写 Python C 扩展:如何正确加载 PyListObject?

在尝试读取一个填充了浮点数并填充real channels[7]它们的值的 Python 列表时(我使用的是 F2C,所以 real 只是浮点的 typedef),我能够从中检索到的只是零值。你能指出下面代码中的错误吗?

0 投票
2 回答
12594 浏览

python - Distutils 找不到 Python.h

我有一个带有扩展部分的 distutils 设置脚本,它看起来像这样:

setup.py build在我的 Mac 上运行正常。当我移动到 Debian 机器时,它失败了:

我已经安装python2.6python2.6-dev安装了,文件位于/usr/include/Python2.6.

它为问题文件执行的命令:

gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/include/python2.6 -c my_module.c -o -build/XYZ/my_module.o

所以它传递了头文件的位置。

Mac 与 Linux 环境之间唯一明显的区别是 gcc-4.2 与 gcc-4.4 以及 Python 2.7 与 Python 2.6

想法?

编辑:

在有问题的 C 文件中:

0 投票
1 回答
2135 浏览

python - 从 C 将对象返回给 Python

我已经阅读了 Python C-API 的文档,甚至还编写了一些扩展模块。但是,当涉及从 C 函数返回 Python 对象时,我仍然不清楚确切的语义。

Python 文档中的有限示例通常显示一个 C 函数,该函数返回Py_BuildValue. 现在,Py_BuildValue返回一个New Reference, 并将这个引用的所有权转移给解释器。那么,我可以由此推断,返回给 Python 的任何对象都必须是一个新的引用,并且从 C 函数返回一个对象与将对象的所有权转移给解释器是一样的,这是一个通用规则吗?

如果是这样,那么返回一个已经被某物拥有的对象的情况呢?例如,假设您编写了一个接受 a PyObject*which is a的 C 函数tuple,然后调用PyTuple_GetItem它并返回结果。 PyTuple_GetItem返回一个借用的引用- 意味着该项目仍然由元组“拥有”。那么,在将结果返回给解释器之前,返回类似结果的 C 函数PyTuple_GetItem是否必须得到结果?INCREF

例如:

0 投票
3 回答
22463 浏览

python - 二进制上传后,easy_install 因错误“找不到安装脚本”而失败?

使用 上传我的 Python C 扩展的二进制分发后python setup.py bdist uploadeasy_install [my-package-name]出现“错误:在 /tmp/easy_install/package-name-etc-etc 中找不到安装脚本”失败。

我究竟做错了什么?

0 投票
1 回答
2645 浏览

python - Python C 扩展中的文档字符串?

在创建 Python 的 C 扩展时,是否能够以某种方式编写作为文档字符串公开扩展用户的注释?

0 投票
2 回答
665 浏览

python - python中实例变量和属性之间的区别?

因此,用于编写扩展的 python 文档是这样说的:

“我们希望将我们的实例变量作为属性公开。有很多方法可以做到这一点。最简单的方法是定义成员定义:

并将定义放在 tp_members 槽中:

但是,我们已经将实例变量放入了 Noddy 结构体中:

所以我的问题是为什么我们把它们放在这两个地方。我的印象是,这是因为我们希望类型和实例都拥有它们,以便在实例更新后保留类型值。但是如果是这样的话,如果我们改变类属性,实例值是如何更新的呢?像这样: