问题标签 [ctypes]

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 投票
7 回答
4742 浏览

python - 在编译之前使用 Python 代码进行原型设计

一段时间以来,我一直在考虑编写一个峰值拟合库。我对 Python 非常了解,并计划一开始就用 Python 实现一切,但设想我最终可能不得不用编译语言重新实现一些核心例程。

IIRC,Python 最初的职责之一是作为原型语言,但是 Python 在允许将函数、函子、对象传递给函数和方法方面非常自由,而我怀疑 C 或 Fortran 并非如此。

关于设计我设想必须与编译语言接口的函数/类,我应该知道什么?这些潜在问题中有多少是由 cTypes、bgen、SWIGBoost.PythonCythonPython SIP等库处理的?

对于这个特定的用例(拟合库),我想允许用户将数学函数(高斯、洛伦兹等)定义为 Python 函数,然后可以将其传递给编译的代码拟合库进行解释。传递和返回数组也是必不可少的。

0 投票
10 回答
25597 浏览

python - Python:SWIG 与 ctypes

在 python 中,在什么情况下 SWIG 比 ctypes 更适合调用共享库中的入口点?假设您还没有 SWIG 接口文件。

两者的性能指标是什么?

0 投票
5 回答
3979 浏览

python - Python ctypes 和函数调用

我的朋友制作了一个适用于 x86 的小型概念验证汇编器。我决定也将它移植到 x86_64,但我立即遇到了问题。

我用 C 写了一小段程序,然后编译和 objdump 代码。之后我将它插入到我的 python 脚本中,因此 x86_64 代码是正确的:

现在,为什么这个脚本在我运行它时总是出现分段错误?

我还有一个关于 mprotect 和没有执行标志的问题。据说它可以防止大多数基本的安全漏洞,如缓冲区溢出。但它被使用的真正原因是什么?你可以继续写,直到你点击 .text,然后将你的指令注入一个不错的 PROT_EXEC 区域。当然,除非您在 .text 中使用写保护

但是,为什么到处都有那个 PROT_EXEC 呢?.text 部分被写保护不是很有帮助吗?

0 投票
4 回答
2117 浏览

python - Python:将 IP 地址打包为 ctype.c_ulong() 以与 DLL 一起使用

给出以下代码:

我怎样才能正确地将它打包为一个期望它作为 c_ulong 数据类型的 DLL?

我试过使用:

但是,该c_ulong()方法返回错误,因为它需要一个整数。

有没有办法用来struct.pack完成这个?

0 投票
1 回答
6900 浏览

python - Python:转换字符串以用于 ctypes.c_void_p()

给定一个字符串:

如何将其定义为ctypes.c_void_p()数据类型?

以下代码产生“无法转换为指针”异常:

data必须是void*C 中的类型,因为它被传递给 DLL。

我假设有一种方法可以使用包来打包/解包字符串struct,但不幸的是我对这个过程非常不熟悉。

0 投票
6 回答
24268 浏览

python - 如何在 Python 中使用 ctypes 卸载 DLL?

我正在使用 ctypes 在 Python 中加载 DLL。这很好用。

现在我们希望能够在运行时重新加载该 DLL。

直接的方法似乎是: 1. 卸载 DLL 2. 加载 DLL

不幸的是,我不确定卸载 DLL 的正确方法是什么。

_ctypes.FreeLibrary 可用,但私有。

还有其他方法可以卸载 DLL 吗?

0 投票
1 回答
2986 浏览

python - 使用 Python 的 ctypes 传递/读取声明为“struct_name *** param_name”的参数?

我正在尝试使用 Python 的 ctypes 库来访问扫描库SANE中的一些方法。这是我第一次使用 ctypes,也是我一年多以来第一次不得不处理 C 数据类型,所以这里有一个公平的学习曲线,但我认为即使没有这个特定的声明也会很麻烦:

首先,我已经成功处理了SANE_Status(an enum) 和SANE_Bool(a typedef to c_int)。这些都很简单。另一方面,第一个参数给我带来了各种各样的悲伤。我不熟悉“ ***”符号,到目前为止,我的示踪子弹只产生了垃圾数据。如何格式化此函数的输入,以便我可以读回我的 Python 结构对象列表?作为参考,被引用的 C 结构是:

其中SANE_String_Const定义为c_char_p.

我的这个对象的 Python/ctypes 版本是:

关于我应该传递什么的建议,以便我可以从中获得预期的行为(结构对象列表)?所有回应表示赞赏。

更新1:

使用以下内容,我能够检索到正确的 SANE_Device Python 结构:

但是,1) 糟糕和 2) 似乎只有在只有一个结果时才会起作用。我不能 len() on devices.contents.contentsor devices.contents.contents.contents。我如何确定结果的数量?SANE 文档指定“如果函数成功执行,它会存储一个指向 *device_list 中指向 SANE_Device 结构的指针的 N​​ULL 终止数组的指针”。建议?

更新 2:

我能够传递一个十项数组,然后使用以下方法访问第一个元素:

但是,十显然是一个任意数字,我无法确定实际结果的数量。devices.contents.contents.contents[1].name在仅连接一个设备时尝试访问会导致分段错误。必须有一种适当的方法来处理像 ctypes 中这样的可变长度构造。

0 投票
2 回答
908 浏览

python - 使用 python 运行未导出的 .dll 函数

这似乎是一个奇怪的问题,但我想知道如何从内存“签名”中运行 .dll 中的函数。我不太了解它的实际工作原理,但我非常需要它。如果您知道它的内存签名和地址,它是一种从 .dll 中运行未导出函数的方法。例如,我有这些:

并且使用一些非常漂亮的 C++ 代码,您可以使用它在 .dll 中运行函数。

这是一篇解释得很好的文章: http ://wiki.alliedmods.net/Signature_Scanning

那么,是否可以使用 Ctypes 或任何其他方式在 python 中执行此操作?

0 投票
3 回答
2804 浏览

python - long double 返回和 ctypes

我有 ac 函数,它返回一个long double. 我想使用 ctypes 从 python 调用这个函数,它主要工作。设置so.func.restype = c_longdouble可以解决问题——除了python的浮点类型是a c_double,所以如果返回值大于双精度,但在长双精度范围内,python仍然将inf作为返回值。我在 64 位处理器上,sizeof(long double)是 16 岁。

在不修改c代码的情况下解决这个问题(例如使用十进制类或numpy)有什么想法吗?

0 投票
1 回答
1939 浏览

python - 如何使用 ctypes 将库的外部函数指针设置为 Python 回调函数?

一些 C 库导出函数指针,以便库的用户将该函数指针设置为他们自己函数的地址以实现挂钩或回调。

在这个示例库liblibrary.so中,如何使用 ctypes 将 library_hook 设置为 Python 函数?

图书馆.h: