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

python - PyArg_ParseTuple 和回调函数指针

我有如下代码:

PyArg_ParseTuple 内部究竟发生了什么?我的猜测是回调获取了我传递给 args(也是 PyObject*)的函数指针。PyArg_ParseTuple 如何将函数指针转换为 PyObject*?

我想知道的是,如果我两次传入同一个回调函数指针会发生什么。我认为回调在 PyArg_ParseTuple 中分配了一个新的 PyObject,因此每次都会获得不同的内存地址,但会包含相同的回调函数指针。

但是如果我 PyObject_Hash 回调,它每次都会产生不同的值,对吧?(因为地址每次都不一样..)

0 投票
3 回答
7143 浏览

python - Python 和 OpenMP C 扩展

我有一个 C 扩展,我想在其中使用 OpenMP。但是,当我导入模块时,出现导入错误:

我已经用-fopenmp 和-lgomp 编译了这个模块。这是因为我的 Python 安装没有使用 -fopenmp 标志编译吗?我必须从源代码构建 Python 吗?或者还有其他的可能吗?这是我在模块中真正使用 openmp 的唯一一次:

如果可能的话,我想坚持使用 openmp,因为它非常简单,而且这种情况下的并行化非常适合它。

编辑:我硬着头皮重新编译了支持 OpenMP 的 Python。我的模块现在可以完美运行,但这并不是一个很好的解决方案。如果它需要完全重新编译 Python,我无法真正分发它。那么有人知道解决这个问题的方法吗?ctypes 会起作用吗?

解决了!这是一个简单的链接问题。(我为此重建了 Python?!)在模块编译期间未正确链接 OpenMP。因此可以加载使用 OpenMP 的 C Python 扩展

0 投票
2 回答
1078 浏览

python - Python C 扩展不是线程安全的?

我用一个相当费力的python脚本制作了ac扩展。代码本身经过良好测试且简单。使用几个大列表调用 c 扩展,然后它执行一些巧妙的算术并返回一些新列表。c 扩展是 100% 自给自足的,它不使用任何其他 c 函数,也不使用任何 python 对象的方法(但它确实使用这些标准 Python 方法:PyFloat_AsDouble、PyList_GetItem、PyList_Size、PyList_New、Py_BuildValue、PyList_Append )。到目前为止,我只在非多线程环境中使用过它。

今天我开始在多线程 GUI 环境中使用它,结果一败涂地。我有一些用于调试的测试用例,奇怪的是,较小的可以通过,而较大的会导致总线错误和分段错误(使 GUI 完全崩溃并在 OS X 中显示“Python 问题报告”窗口) . 我的c扩展不是线程安全的问题吗?如果是这样,我怎样才能使它成为线程安全的?我试着用谷歌搜索这个主题,但我还没有真正找到任何我能理解的好信息。我检查了这个这个页面,但我真的不明白他们在说什么。哪种类型的代码需要 GIL,哪些不需要?

这里值得一提的是转储:

0 投票
2 回答
2184 浏览

python - 为 python 包制作可选 C 扩展的最简单方法是什么?

我创建了一个 C 扩展,我想在我的 Python 包中启用它(使用 setuptools),只有在传入命令行选项时。最简单的方法是什么?

我似乎找不到任何直接的方法来解决这个问题。

0 投票
1 回答
653 浏览

python - 为什么这个 C 方法会出现段错误?

我正在用 C 编写一个不可变的链表类,但一种方法是神秘的段错误。该代码旨在大致等同于:

这是我的代码:

如果我运行此代码,它会在最后一行出现段错误:

我确定我只是在做一些愚蠢的事情,但我不明白它是什么。有什么我想念的吗?

0 投票
2 回答
2428 浏览

python - 动态二进制检测框架 PIN 的 Python 接口

我使用 Python 分析二进制文件。我一直在使用调试器进行动态分析(即运行应用程序并使用断点来获取运行时执行)。但是,如果我可以使用一些像PIN这样的二进制仪器框架,结果可以得到改善。PIN 是用 C++ 开发的,并作为封闭源代码(仅限 dll)提供。我们编写了一个叫做 PinTools 的东西来描述我们想要拦截的位置和内容。我想将 PIN 功能移植到 Python 中,以便继续使用 Python。我知道“ctypes”和 boost-python。

我的问题是:为了使用 PIN,我们编写了一个 pintool 并使用 Pin 和 pintool 运行我们的二进制可执行文件(就像使用 JIT 运行应用程序一样)。现在,我不知道是否可以使用 ctypes 等来导入 PIN 函数并使用此 python 代码动态分析二进制文件。您能否就如何进行此任务提供一些建议或指导。

因此,在 nut-n-shell 中,我想为 PIN 框架创建一个 Python 接口(包装器)。

0 投票
4 回答
300 浏览

python - Python/C:一次解析所有值以返回 Python?

如果您在 Python 中将大量值从 C 输出到 dict,有没有比以下更好(更快且更不容易出错)的方法:

0 投票
2 回答
2795 浏览

python - DYLD_LIBRARY_PATH/LD_LIBRARY_PATH 的替代品

我正在开发用于 OSX 和 linux 的 python C++ 扩展。目前,我可以使用包装脚本运行我的代码wrapper.sh

它能够像这样设置我的运行:wrapper.sh app.py

我想做的是消除对wrapper.sh. 我不能将我的库放在某个标准位置,比如/usr/local/lib因为在我的机器上,我维护了我的库的几个独立实例。也就是说,我的库需要保存在相对于我的安装路径的某个位置。出于同样的原因,我不能将这些环境变量放在我的登录脚本中。目前,我需要调用我的一个wrapper.sh脚本来使用相关的库。我的目标是能够运行app.py,如果它位于我的安装路径中,应该能够找到它相关的 python 和库。目的是简化用户的执行,并简化外部工具(如鼻子测试)的使用。

当我构建我的 python 版本时,一种替代方法似乎是使用 rpath:

这个技巧似乎在 linux 上运行良好,尽管trunk/src/python/lib/python2.6/lib-dynload由于某种我不清楚的原因最终需要将我的一个库直接复制到其中。但是,这个技巧不适用于 OSX;看起来我需要install_name_tool在我所有的 dylibs 库上运行。

我想出的另一种选择是做这样的事情:

这样我的脚本都可以使用#! ../python,但我遇到了Unmatched ".错误。如果我使用#! ../wrapper.sh. 我不是真正的bash专家......

然而,这些都显得如此不必要的复杂,这肯定是其他人已经解决的问题??感谢您的任何建议!

0 投票
3 回答
1575 浏览

python - 如何从 Python C 代码中断言?

我正在用 C 编写一个 Python 类,我想在我的调试代码中添加断言。assert.h很适合我。这只会被放入调试编译中,因此断言失败不会影响 Python 代码的用户*。

我正在尝试划分我的“库”代码(它应该与链接到 Python 的代码分开),以便我可以将它与其他 C 代码一起使用。因此,我的 Python 方法是纯 C 代码的精简包装器。

所以我不能在我的“库”代码中这样做:

因为这用 Python 污染了我的纯 C 代码。它也比简单的丑得多

我相信 Distutils 编译器总是设置,这意味着即使在调试版本中NDEBUG我也无法使用。assert.h

Mac 操作系统和 Linux。

帮助!

*我听说过一个反对在从 Python 调用的 C 代码中断言的论点。

0 投票
1 回答
1088 浏览

python - 从 C 返回 CTypes 指针

我正在编写一个 Python C 扩展,它需要将 CTypes 指针返回到char内存中的数组(我需要与另一个需要 CTypes 指针的 Python 库交互)。

我找不到关于 C 的任何类型的 CTypes 接口的任何文档。是否有任何解决方法,例如调用 Python 指针构造函数?

提前致谢。