问题标签 [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 投票
1 回答
2790 浏览

python - PyArg_ParseTuple 默认参数

如果我有以下函数并且myobj未传递可选参数,是myobj保留NULL还是设置为Py_None

根据解析参数和构建值

|指示 Python 参数列表中的其余参数是可选的。与可选参数对应的 C 变量应初始化为其默认值——当未指定可选参数时,PyArg_ParseTuple() 不会触及相应 C 变量的内容。

这适用于PyObject *s 吗?它显然是一个存在于 C 中的指针,因此可以说它是 C 变量,但它是指向 python 对象的指针,因此也可以说它不算作 C 变量。

0 投票
3 回答
2872 浏览

python - Python C 扩展 - 为什么可调用的 C 函数必须接受参数并返回 PyObject *

我刚刚开始使用 Python C 扩展,并且很好奇为什么可从 Python 调用的 C 函数必须采用 2 个 PyObject* 参数并返回一个 PyObject*。我写了以下“Hello World”扩展:

为什么我不能(尤其是使用 METH_NOARGS)使用以下 hello_world 方法:

?

0 投票
1 回答
2096 浏览

python - 将 Python 长整数转换为 C 字符数组

我正在使用 Python/C API,并且希望 C 函数采用 Python 长整数参数,nPyLong并将其转换为 char 数组,nString以 10 为底。这是我想做的一个片段。

API 参考中提到了一个函数PyObject* PyLong_FromString(char *str, char **pend, int base),该函数将 C char 数组转换为 Python 长整数,给定任意基数,但我找不到执行相反操作的函数。

这可能吗?一种想法是将 Python 长整数转换为 Python 字符串对象,然后转换为 C 字符数组,但也没有字符串函数可以处理长整数。似乎 C 处理 Python long int 的唯一方法是转换为 C int 类型,所有这些都会在我的应用程序中溢出。

0 投票
1 回答
2694 浏览

python - Python C 扩展 - 为什么使用关键字参数的方法转换为 PyCFunction

我正在学习 Python-C 扩展,并且对为什么必须将使用关键字参数的方法强制转换为 PyCFunctions 感到困惑。

我对 PyCFunction 的理解是它需要两个指向 PyObjects 的指针并返回一个指向 PyObject 的指针 - 例如

如果我要使用一个使用关键字参数的函数,那么这个函数将采用三个指向 PyObjects 的指针并返回一个指向 PyObject 的指针 - 例如

但是,当我创建模块函数数组时(对于名为“加法器”的函数):

工作正常。感觉就像我将浮点数转换为 int 并且仍然必须使用浮点数的非整数部分。如果我没有看到这项工作,我会认为它不会工作。我在这里不明白什么?

此外,我看到一些对 PyCFunctionWithKeywords 的引用,它似乎具有我认为我需要的函数签名,但我的编译器抱怨(发出警告)关于“不兼容的指针类型”。

PyCFunctionWithKeywords 是否已弃用?如果没有,是否有时间我应该/必须使用它?

0 投票
1 回答
2131 浏览

python - PyList_SetItem 与 PyList_SETITEM

据我所知,PyList_SetItem 和 PyList_SETITEM 之间的区别在于 PyList_SetItem 会降低它覆盖的列表项的引用计数,而 PyList_SETITEM 不会。

有什么理由不应该一直使用 PyList_SetItem 吗?或者如果我使用 PyList_SetItem 来初始化列表中的索引位置,我会遇到麻烦吗?

0 投票
1 回答
379 浏览

python - 如何更改传递给 python C-extension 的 numpy 数组元素?

这应该是一个微不足道的问题,但作为初学者并没有弄清楚。

我有以下使用 numpy 数组的 Python C 扩展:

将其编译为共享库后,发现以下调用未能将元素 clmn 数组修改为“1”:

提前致谢!

0 投票
2 回答
976 浏览

c++ - python C API 是否与 C++ 完全兼容?

据我了解C和C++之间的关系,后者本质上是前者的扩展,并且保留了一定程度的向后兼容性。假设可以使用 C++ 代码调用 python C API 是否安全?

更重要的是,我注意到官方 python 文档将 C 和 C++ 扩展捆绑在同一页面上。我在任何地方都找不到 C++ API。这让我相信相同的 API 在两种语言中都可以安全使用。

有人可以确认或否认这一点吗?

编辑:

我想我让我的问题比它需要的复杂得多。问题是:我必须做什么才能用 C++ 编写 python 模块?我是否只是按照此处列出的相同指示,用 C 代码代替 C++?有单独的 API 吗?

0 投票
1 回答
7324 浏览

python - PyMODINIT_FUNC 和 PyModule_Create 之间的区别

如果我理解正确,

  1. PyModule_CreatePython 2.X中的 PyMODINIT_FUNC已替换为Python3.X
  2. 两者都 return PyObject*,但是,在 Python 3.X 中,模块的初始化函数必须返回PyObject*给模块 - 即

    而在 Python2.X 中,这不是必需的 - 即

    /li>

所以,我的健全性检查问题是:

  • 我的理解正确吗?
  • 为什么会做出这样的改变?

现在,我只是在试验非常简单的 Python 的 C 扩展案例。也许如果我做得更多,这个问题的答案会很明显,或者如果我试图将 Python 嵌入到其他东西中......

0 投票
3 回答
174 浏览

python - 看起来 Python C-API 中的 C 代码将 ptr 返回到堆栈变量。我错过了什么?

当我看到以下代码片段时,我正在阅读文件 methodobject.c,因为我正在尝试学习如何为 Python 制作 C 扩展:

我看的越多

我越是意识到我不明白。我认为它返回了一个指向 meth 的指针,它是一个函数,它接受 self(一个本地声明的指针)和 arg(一个从外部传递到 PyCFunctionCall 的指针)。但是,因为在我看来 meth 和 self 好像是在堆栈上分配的,所以一旦 PyCFunctionCall 退出,它们将被释放,这将导致它们传递给的任何变量出现问题。

我在这里想念什么?

0 投票
2 回答
9097 浏览

python - PyArg_ParseTupleAndKeywords 是如何工作的?

我一直在尝试学习如何为 Python 编写 C 扩展,并希望确保我了解 PyArg_ParseTupleAndKeywords 的工作原理。

我相信第一个参数是一个 PyObject 指针,它指向按传递顺序传递给 C 扩展函数的参数数组。第二个参数是传递的关键字列表,它们传递的位置,很可能是某种指示标志,告诉关键字从哪个位置开始,位置变得无关紧要。

然后 PyArg_ParseTupleAndKeywords 使用其关键字列表(第 4 个参数)在用关键字指定的参数与格式字符串(第 3 个参数)和 C 变量的地址(第 5 个和 + 参数)之间进行映射,适当的值应复制到该地址。

我的理解正确吗?当我阅读在线文档时,我看到的只是对“位置参数和关键字参数”的引用,这让我感觉有点摸不着头脑。处理 PyArg_ParseTupleAndKeywords 的 Python 解释器的文件在哪里?