问题标签 [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 和回调函数指针
我有如下代码:
PyArg_ParseTuple 内部究竟发生了什么?我的猜测是回调获取了我传递给 args(也是 PyObject*)的函数指针。PyArg_ParseTuple 如何将函数指针转换为 PyObject*?
我想知道的是,如果我两次传入同一个回调函数指针会发生什么。我认为回调在 PyArg_ParseTuple 中分配了一个新的 PyObject,因此每次都会获得不同的内存地址,但会包含相同的回调函数指针。
但是如果我 PyObject_Hash 回调,它每次都会产生不同的值,对吧?(因为地址每次都不一样..)
python - Python 和 OpenMP C 扩展
我有一个 C 扩展,我想在其中使用 OpenMP。但是,当我导入模块时,出现导入错误:
我已经用-fopenmp 和-lgomp 编译了这个模块。这是因为我的 Python 安装没有使用 -fopenmp 标志编译吗?我必须从源代码构建 Python 吗?或者还有其他的可能吗?这是我在模块中真正使用 openmp 的唯一一次:
如果可能的话,我想坚持使用 openmp,因为它非常简单,而且这种情况下的并行化非常适合它。
编辑:我硬着头皮重新编译了支持 OpenMP 的 Python。我的模块现在可以完美运行,但这并不是一个很好的解决方案。如果它需要完全重新编译 Python,我无法真正分发它。那么有人知道解决这个问题的方法吗?ctypes 会起作用吗?
解决了!这是一个简单的链接问题。(我为此重建了 Python?!)在模块编译期间未正确链接 OpenMP。因此可以加载使用 OpenMP 的 C Python 扩展。
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,哪些不需要?
这里值得一提的是转储:
python - 为 python 包制作可选 C 扩展的最简单方法是什么?
我创建了一个 C 扩展,我想在我的 Python 包中启用它(使用 setuptools),只有在传入命令行选项时。最简单的方法是什么?
我似乎找不到任何直接的方法来解决这个问题。
python - 为什么这个 C 方法会出现段错误?
我正在用 C 编写一个不可变的链表类,但一种方法是神秘的段错误。该代码旨在大致等同于:
这是我的代码:
如果我运行此代码,它会在最后一行出现段错误:
我确定我只是在做一些愚蠢的事情,但我不明白它是什么。有什么我想念的吗?
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 接口(包装器)。
python - Python/C:一次解析所有值以返回 Python?
如果您在 Python 中将大量值从 C 输出到 dict,有没有比以下更好(更快且更不容易出错)的方法:
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专家......
然而,这些都显得如此不必要的复杂,这肯定是其他人已经解决的问题??感谢您的任何建议!
python - 如何从 Python C 代码中断言?
我正在用 C 编写一个 Python 类,我想在我的调试代码中添加断言。assert.h
很适合我。这只会被放入调试编译中,因此断言失败不会影响 Python 代码的用户*。
我正在尝试划分我的“库”代码(它应该与链接到 Python 的代码分开),以便我可以将它与其他 C 代码一起使用。因此,我的 Python 方法是纯 C 代码的精简包装器。
所以我不能在我的“库”代码中这样做:
因为这用 Python 污染了我的纯 C 代码。它也比简单的丑得多
我相信 Distutils 编译器总是设置,这意味着即使在调试版本中NDEBUG
我也无法使用。assert.h
Mac 操作系统和 Linux。
帮助!
*我听说过一个反对在从 Python 调用的 C 代码中断言的论点。
python - 从 C 返回 CTypes 指针
我正在编写一个 Python C 扩展,它需要将 CTypes 指针返回到char
内存中的数组(我需要与另一个需要 CTypes 指针的 Python 库交互)。
我找不到关于 C 的任何类型的 CTypes 接口的任何文档。是否有任何解决方法,例如调用 Python 指针构造函数?
提前致谢。