问题标签 [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 回答
133 浏览

python - 在构造函数中获取列表的 Python 对象扩展永远不会通过创建步骤(SIGSEV),为什么?

我一直在与一个错误作斗争,但我对正在发生的事情以及为什么它不起作用没有任何想法。

首先,我试图通过 C 扩展为 Python 创建一个新的对象类型。该对象是使用列表、numpy 数组等创建的……但我什至无法使这部分工作。

失败的实际最小代码是:

此代码是按照提示(和复制/粘贴)编写的:http: //docs.python.org/extending/newtypes.html

我已经测试了 Noddy 代码并且它可以工作,但是如果我添加第四个参数来获取列表,它也会以 sigsev 退出。

我编译上面的代码:

我使用它: if name == ' main ': data_con = [3,4,5,6] matrix = CondensedMatrix(data_con)

我还阅读了 CApi 中的 PyArg_ParseTuple SegFaults

有谁知道为什么在 pyarg_parsetuple 之后会出现段错误?

Ubuntu 12.04、gcc 4.6.3、Python 2.7.3

谢谢!

0 投票
1 回答
274 浏览

python - 实施 nb_inplace_add 导致返回只读缓冲区对象

我正在编写就地添加操作的实现。但是,由于某种原因,我有时会得到一个只读缓冲区作为结果(而我正在添加一个自定义扩展类和一个整数......)。

相关代码为:

如果我没有返回(PyObject*)Tself(或简单地“自我”),而是引发异常,则原始对象会正确更新[使用 some 检查printf]。如果我使用Py_RETURN_NONE宏,它会正确地变成ModPolyNone在 python 端)。

我究竟做错了什么?我正在返回一个指向ModPoly对象的指针,这怎么会成为一个缓冲区?而且我没有看到对这些指针的任何操作。

示例用法:

我尝试将返回线更改为:

并且1在就地添加时打印(意味着返回的值是类型ModPolynomial...)

0 投票
1 回答
203 浏览

python-c-extension - 从 python 调用遗留的 c 函数

我想从 python 调用遗留的 c 第三方函数。我创建了一个 C api 来简化函数调用。在我的 python 文件中,我尝试为与旧代码库链接的 api 导入 *.so。但我一直看到 libxxx(遗留的 c 库)未找到错误。我尝试同时导入两者,但仍然看到相同的错误。然后我尝试使用 ctypes,但得到错误 ctypes not found。有什么建议么 ?

0 投票
1 回答
1020 浏览

python - 从python调用第三方c函数

我需要从 python 内部调用第三方 c 函数。为此,我创建了 ac api,它具有所有 python 特定的 c 代码(使用 METH_VARARGS)来调用第三方函数。我将此代码 liba.so 与 3 方库 libb.so 链接在我的 python 文件中,我正在做:

Python 现在抱怨 libb.so not found。我究竟做错了什么 ?

0 投票
5 回答
8366 浏览

python-c-api - 如何在 python 的 C 文件中引用#defines?

我有一个 C 文件,其中包含一堆我想从 python 引用的位的#defines。它们足够多,我宁愿不将它们复制到我的 python 代码中,而是有一种可接受的方法可以直接从 python 引用它们?

注意:我知道我可以打开头文件并解析它,这很简单,但如果有更 Pythonic 的方式,我想使用它。

编辑:

这些是非常简单的#defines,用于定义掩码中位的含义,例如:

0 投票
2 回答
11193 浏览

python - C 数组到 PyArray

我正在编写一个不使用 Cython 的 Python C 扩展。

我想在 C 中分配一个双精度数组,在内部函数中使用它(恰好在 Fortran 中)并返回它。我指出 C-Fortran 接口在 C 中完美运行。

我调试了这段代码,当我尝试从 alpha 中创建 alpha 时出现分段错误。到那里一切正常。函数 drecur_ 有效,如果将其删除,我会遇到同样的问题。

现在,围绕 C 数据定义 PyArray 的标准方法是什么?我找到了文档,但没有很好的例子。另外,内存泄漏怎么办?在返回之前对 INCREF 是否正确,以便保留 alpha 和 beta 的实例?当不再需要它们时,释放怎么办?

编辑 我终于用NumPy cookbook中的方法做对了。

随时对此发表评论,并感谢您的回答。

0 投票
0 回答
707 浏览

c++ - 使用 PyMethodDef 注册非静态方法

我正在寻找一种将 MyWidget 类的非静态方法注册为 python 方法的方法。

MyWidget 类是一个 QWidget 类,它位于主窗口中。因此,我想在启动应用程序时初始化 python,然后我想从 MyWidget 类中的 MyTableWidget (QTableWidget) 中检索信息。我喜欢将 itemCount 非静态方法注册为 python 方法。我不能这样做,因为非静态对象注册在下面的 myPythonCommands 上给出了错误。

我检查了 boost::python 但找不到方法。据我所知,在 C++ 中创建一个 python 类是文档封面,但不是他的。

我想知道你们中是否有人知道一种方法并指出我正确的方向?

0 投票
1 回答
2629 浏览

python - 使用嵌入式 Python/C 函数编译文件 .c

我开始研究 Python/C API,并编写了第一个代码来测试一些函数,我写了这个:

文件:test.c

我用命令编译:

我有错误未定义对“Py_BuildValue”的引用

我运行后:

这个编译没有错误,但是当我运行编译文件时,我有一个

如何设置 gcc 参数?

我有 ubuntu 12.04、python 2.7.3、gcc 4.6.3 并安装了 python-dev。

谢谢。

0 投票
1 回答
1890 浏览

python - Python C 扩展:返回 PyFloat_FromDouble(double) 段错误

我最近将一些慢速 python 代码转换为 C 扩展。它工作得很好,除了它在第 162 次调用时生成段错误,就在 return 语句处。

这是它的工作原理。有一次,在对要计算的函数的所有调用之前,我将数据加载到内存中(记住 INCREF 父对象):

(有关 C 数组方法,请参阅http://www.scipy.org/Cookbook/C_Extensions/NumPy_arrays )。然后我在我将从 python 调用的函数中引用加载的 double[][], DOSAGES:

通过大量调试语句(如您所见),我已将段错误本地化为 return 语句。也就是说,在 python 浮点对象的实例化之后,但是在从 C 调用 return 和 python 的下一个执行行之间的某个位置(你猜对了,一个 print("debugReturned")。我在 stdout 中看到的是:

所以 double 不是一个奇怪的值,python 对象是正确创建的,它不是 NULL,但是从 C 返回和在 python 中继续之间存在一些错误。在线资料表明这可能是一个 INCREF/DECREF 问题,但也指出 PyFloat_FromDouble() 和 Py_BuildValue("f",double) 会生成新的引用,因此不需要进行 INCREF。两种选择都会产生相同的结果。虽然我有理由确定我需要在我的 grm_loadDosage 函数期间对持有我的矩阵的 PyObject 进行 INCREF,但我已经尝试了使用和不使用 INCREF 的情况,其行为相同。

有什么想法吗?

谢谢

此外,堆栈跟踪:

0 投票
1 回答
4554 浏览

python - Python C 扩展 - 接收字典作为参数

我正在编写一个 C 扩展,我对如何接收一个 dict 作为参数感到很困惑。由于文档没有关于如何实现这一点的任何细节,我尝试将参数解析为 Python 对象,然后将其作为字典进行操作:

但是代码解析失败:

据我从错误消息中可以理解,格式 char 是错误的(我认为“o”应该代表任何 Python 对象)。

将 Python dict 解析为 C 指针的最佳方法是什么?我正在浏览文档,但我没有找到与此类似的任何内容。

谢谢你。