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

python - 使用带有指向结构的指针的 ctypes 调用函数

我正在尝试从 python 调用位于共享对象中的 C 函数,并且使用 ctypes 似乎是实现此目的的最佳方法。我必须使用以下函数原型将派生类型传递给该函数:

Config结构定义为

Coord定义为

然后,python ctypes 代码只是对派生类型的重写:

然后我设置了参数MyFunc

但是,这会产生段错误。有人知道这里发生了什么吗?

更新 我的问题中有一个错字,从剪切和粘贴开始,问题仍然存在!

0 投票
2 回答
13022 浏览

c++ - Python ctypes:初始化 c_char_p()

我写了一个简单的 C++ 程序来说明我的问题:

我把它编译成一个so。我从python调用:

当我运行它时,我的输出是:

我期望:

我错过了什么?

谢谢。

0 投票
2 回答
1820 浏览

python - 构造可从 C 调用的python函数,输入参数具有*输出*语义

用例如下:

  • 给定一个用 C 实现的(固定的,不可更改的)DLL
  • 需要:在 python 中实现的这个 DLL 的包装器(选择的方法:ctypes)

DLL 中的一些函数需要同步原语。为了获得最大的灵活性,DLL 的设计者完全依赖于客户端提供的回调。更准确地说,该 DLL 应具有:

  • 用于创建同步对象的回调函数
  • 获取/释放同步对象锁定的回调函数
  • 和一个用于销毁同步对象的回调函数

因为从DLL的角度来看,同步对象是不透明的,它会被一个void *实体所代表。例如,如果其中一个 DLL 函数想要获取锁,它应该这样做:

可以看出,回调create_mutex输入参数具有输出语义。这是通过void **签名实现的。

这个回调(和其他三个)必须在 python 中实现。我失败了 :-) 为简单起见,让我们只关注创建回调,也为简单起见,让不透明对象为int.

模拟回调使用的玩具 DLL 如下 (ct_test.c):

想要提供回调并使用 DLL 的 python 代码如下:

当使用 in-DLL 提供的回调(通过设置set_c_callback())时,这可以按预期工作:

但是,在另一种情况下 - 使用 python 回调 - 失败:

我哪里错了?

0 投票
14 回答
132582 浏览

python - WindowsError:[错误 126] 找不到指定的模块

我正在使用以下代码在 python 中加载 dll:

但我不断收到以下错误

WindowsError:[错误 126] 找不到指定的模块

dll 存在于指定的路径中,但我不明白为什么会出现错误。

0 投票
12 回答
82578 浏览

python - 在 Python 中包装 C 库:C、Cython 还是 ctypes?

我想从 Python 应用程序调用 C 库。我不想包装整个 API,只包装与我的案例相关的函数和数据类型。在我看来,我有三个选择:

  1. 在 C 中创建一个实际的扩展模块。可能有点矫枉过正,而且我还想避免学习扩展编写的开销。
  2. 使用Cython将 C 库中的相关部分公开给 Python。
  3. 在 Python 中完成所有工作,ctypes用于与外部库进行通信。

我不确定 2) 还是 3) 是更好的选择。3) 的优点是它ctypes是标准库的一部分,并且生成的代码将是纯 Python ——尽管我不确定这种优势实际上有多大。

任何一种选择都有更多的优点/缺点吗?您推荐哪种方法?


编辑:感谢您的所有回答,它们为任何想要做类似事情的人提供了很好的资源。当然,仍然需要针对单个案例做出决定——没有一个“这是正确的事情”之类的答案。对于我自己的情况,我可能会使用 ctypes,但我也期待在其他项目中尝试 Cython。

由于没有单一的正确答案,因此接受一个有点武断。我选择了 FogleBird 的答案,因为它提供了对 ctypes 的一些很好的见解,而且它目前也是投票率最高的答案。但是,我建议阅读所有答案以获得良好的概述。

再次感谢。

0 投票
1 回答
2190 浏览

python - 为什么 ctypes WriteProcessMemory() 失败?

我一直试图让这个功能工作一段时间,但没有运气。

GetLastError() 返回 87 (0x57),即 ERROR_INVALID_PARAMETER。对于这个函数,我直接从 Justin Seitz 的 Gray Hat Python 中复制了它。不确定我做错了什么,ReadProcessMemory() 效果很好并返回适当的值。

对于地址,我现在选择一个随机位置,0x00050000,并传递像“\x61”这样的数据,在没有改变之前和之后读取位置。

我感觉这是一个简单的错误,在此先感谢您的帮助。导航。


虽然你是对的,但这是一件特权的事情。我似乎仍然无法弄清楚我在寻找什么。这是我的启动过程代码:

我需要以不同的方式创建流程吗?我应该在 SecDescriptor 结构中添加什么?MSDN 对 DACL 和 ACE 的帮助不是很大吗?感谢到目前为止的所有帮助。

PS - 只是一个想法,调试器或其他一些程序如何不产生进程并且能够改变内存?

0 投票
2 回答
628 浏览

python - 不能再使用 Python 2.6 C 接口,但 2.5 可以工作

我刚刚注意到我不能再使用 Python 2.6 dll。Python 2.5 工作得很好。

我做错了什么还是 Python 2.6 坏了?

更新

  1. 用 Python 2.7 alpha dll 试过这个,它似乎可以工作,所以它可能是 2.6 的问题。
  2. 在带有 Python 2.7 alpha 的 Ubuntu x64 上进行了尝试,并且没有出现分段错误。
0 投票
1 回答
1307 浏览

c++ - Python ctypes 回调函数到 SWIG

我有一个 SWIG C++ 函数,它需要一个函数指针 (WNDPROC),并想给它一个由 ctypes.WINFUNCTYPE 包装的 Python 函数。

在我看来,这应该是兼容的,但是 SWIG 的类型检查会引发异常,因为它不知道 ctypes.WINFUNCTYPE 类型实际上是 WNDPROC。

我该怎么做才能将我的回调传递给 SWIG 以便它理解它?

0 投票
1 回答
2568 浏览

python - Python ctypes CFuncType的地址

与我的另一个问题有关

如何获取 CFuncType 对象的地址(实际函数指针)?addressof() 不报告正确的地址。

C代码:

Python代码:

输出:

尝试从 C 调用 *(7030864) 会导致崩溃,但调用 *(3411932) 会按预期工作。addressof() 有什么问题?

0 投票
5 回答
2048 浏览

python - python中的用户指针

*我正在尝试显示使用 v4l 捕获的网络摄像头的预览。

以下是代码的外观:

我得到 ValueError: not enough image data


好吧,我进口

然后之后

诸如此类的东西,我尝试获取记忆

现在 b_address 不再 = None b_address 类似于 c_void_p(145014784)

然后我启动循环、QBUF、DQBUF 等。

问题是,当我调用 pygame.image.frombuffer

我得到 TypeError: expected a character buffer object