问题标签 [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.
python - PyArg_ParseTuple 默认参数
如果我有以下函数并且myobj
未传递可选参数,是myobj
保留NULL
还是设置为Py_None
?
根据解析参数和构建值,
|
指示 Python 参数列表中的其余参数是可选的。与可选参数对应的 C 变量应初始化为其默认值——当未指定可选参数时,PyArg_ParseTuple() 不会触及相应 C 变量的内容。
这适用于PyObject *
s 吗?它显然是一个存在于 C 中的指针,因此可以说它是 C 变量,但它是指向 python 对象的指针,因此也可以说它不算作 C 变量。
python - Python C 扩展 - 为什么可调用的 C 函数必须接受参数并返回 PyObject *
我刚刚开始使用 Python C 扩展,并且很好奇为什么可从 Python 调用的 C 函数必须采用 2 个 PyObject* 参数并返回一个 PyObject*。我写了以下“Hello World”扩展:
为什么我不能(尤其是使用 METH_NOARGS)使用以下 hello_world 方法:
?
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 类型,所有这些都会在我的应用程序中溢出。
python - Python C 扩展 - 为什么使用关键字参数的方法转换为 PyCFunction
我正在学习 Python-C 扩展,并且对为什么必须将使用关键字参数的方法强制转换为 PyCFunctions 感到困惑。
我对 PyCFunction 的理解是它需要两个指向 PyObjects 的指针并返回一个指向 PyObject 的指针 - 例如
如果我要使用一个使用关键字参数的函数,那么这个函数将采用三个指向 PyObjects 的指针并返回一个指向 PyObject 的指针 - 例如
但是,当我创建模块函数数组时(对于名为“加法器”的函数):
工作正常。感觉就像我将浮点数转换为 int 并且仍然必须使用浮点数的非整数部分。如果我没有看到这项工作,我会认为它不会工作。我在这里不明白什么?
此外,我看到一些对 PyCFunctionWithKeywords 的引用,它似乎具有我认为我需要的函数签名,但我的编译器抱怨(发出警告)关于“不兼容的指针类型”。
PyCFunctionWithKeywords 是否已弃用?如果没有,是否有时间我应该/必须使用它?
python - PyList_SetItem 与 PyList_SETITEM
据我所知,PyList_SetItem 和 PyList_SETITEM 之间的区别在于 PyList_SetItem 会降低它覆盖的列表项的引用计数,而 PyList_SETITEM 不会。
有什么理由不应该一直使用 PyList_SetItem 吗?或者如果我使用 PyList_SetItem 来初始化列表中的索引位置,我会遇到麻烦吗?
python - 如何更改传递给 python C-extension 的 numpy 数组元素?
这应该是一个微不足道的问题,但作为初学者并没有弄清楚。
我有以下使用 numpy 数组的 Python C 扩展:
将其编译为共享库后,发现以下调用未能将元素 clmn 数组修改为“1”:
提前致谢!
c++ - python C API 是否与 C++ 完全兼容?
据我了解C和C++之间的关系,后者本质上是前者的扩展,并且保留了一定程度的向后兼容性。假设可以使用 C++ 代码调用 python C API 是否安全?
更重要的是,我注意到官方 python 文档将 C 和 C++ 扩展捆绑在同一页面上。我在任何地方都找不到 C++ API。这让我相信相同的 API 在两种语言中都可以安全使用。
有人可以确认或否认这一点吗?
编辑:
我想我让我的问题比它需要的复杂得多。问题是:我必须做什么才能用 C++ 编写 python 模块?我是否只是按照此处列出的相同指示,用 C 代码代替 C++?有单独的 API 吗?
python - PyMODINIT_FUNC 和 PyModule_Create 之间的区别
如果我理解正确,
PyModule_Create
Python 2.X中的 PyMODINIT_FUNC已替换为Python3.X两者都 return
PyObject*
,但是,在 Python 3.X 中,模块的初始化函数必须返回PyObject*
给模块 - 即而在 Python2.X 中,这不是必需的 - 即
/li>
所以,我的健全性检查问题是:
- 我的理解正确吗?
- 为什么会做出这样的改变?
现在,我只是在试验非常简单的 Python 的 C 扩展案例。也许如果我做得更多,这个问题的答案会很明显,或者如果我试图将 Python 嵌入到其他东西中......
python - 看起来 Python C-API 中的 C 代码将 ptr 返回到堆栈变量。我错过了什么?
当我看到以下代码片段时,我正在阅读文件 methodobject.c,因为我正在尝试学习如何为 Python 制作 C 扩展:
我看的越多
我越是意识到我不明白。我认为它返回了一个指向 meth 的指针,它是一个函数,它接受 self(一个本地声明的指针)和 arg(一个从外部传递到 PyCFunctionCall 的指针)。但是,因为在我看来 meth 和 self 好像是在堆栈上分配的,所以一旦 PyCFunctionCall 退出,它们将被释放,这将导致它们传递给的任何变量出现问题。
我在这里想念什么?
python - PyArg_ParseTupleAndKeywords 是如何工作的?
我一直在尝试学习如何为 Python 编写 C 扩展,并希望确保我了解 PyArg_ParseTupleAndKeywords 的工作原理。
我相信第一个参数是一个 PyObject 指针,它指向按传递顺序传递给 C 扩展函数的参数数组。第二个参数是传递的关键字列表,它们传递的位置,很可能是某种指示标志,告诉关键字从哪个位置开始,位置变得无关紧要。
然后 PyArg_ParseTupleAndKeywords 使用其关键字列表(第 4 个参数)在用关键字指定的参数与格式字符串(第 3 个参数)和 C 变量的地址(第 5 个和 + 参数)之间进行映射,适当的值应复制到该地址。
我的理解正确吗?当我阅读在线文档时,我看到的只是对“位置参数和关键字参数”的引用,这让我感觉有点摸不着头脑。处理 PyArg_ParseTupleAndKeywords 的 Python 解释器的文件在哪里?