问题标签 [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.
python - 使用带有指向结构的指针的 ctypes 调用函数
我正在尝试从 python 调用位于共享对象中的 C 函数,并且使用 ctypes 似乎是实现此目的的最佳方法。我必须使用以下函数原型将派生类型传递给该函数:
Config
结构定义为
Coord
定义为
然后,python ctypes 代码只是对派生类型的重写:
然后我设置了参数MyFunc
:
但是,这会产生段错误。有人知道这里发生了什么吗?
更新 我的问题中有一个错字,从剪切和粘贴开始,问题仍然存在!
c++ - Python ctypes:初始化 c_char_p()
我写了一个简单的 C++ 程序来说明我的问题:
我把它编译成一个so。我从python调用:
当我运行它时,我的输出是:
我期望:
我错过了什么?
谢谢。
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 回调 - 失败:
我哪里错了?
python - WindowsError:[错误 126] 找不到指定的模块
我正在使用以下代码在 python 中加载 dll:
但我不断收到以下错误
WindowsError:[错误 126] 找不到指定的模块
dll 存在于指定的路径中,但我不明白为什么会出现错误。
python - 在 Python 中包装 C 库:C、Cython 还是 ctypes?
我想从 Python 应用程序调用 C 库。我不想包装整个 API,只包装与我的案例相关的函数和数据类型。在我看来,我有三个选择:
- 在 C 中创建一个实际的扩展模块。可能有点矫枉过正,而且我还想避免学习扩展编写的开销。
- 使用Cython将 C 库中的相关部分公开给 Python。
- 在 Python 中完成所有工作,
ctypes
用于与外部库进行通信。
我不确定 2) 还是 3) 是更好的选择。3) 的优点是它ctypes
是标准库的一部分,并且生成的代码将是纯 Python ——尽管我不确定这种优势实际上有多大。
任何一种选择都有更多的优点/缺点吗?您推荐哪种方法?
编辑:感谢您的所有回答,它们为任何想要做类似事情的人提供了很好的资源。当然,仍然需要针对单个案例做出决定——没有一个“这是正确的事情”之类的答案。对于我自己的情况,我可能会使用 ctypes,但我也期待在其他项目中尝试 Cython。
由于没有单一的正确答案,因此接受一个有点武断。我选择了 FogleBird 的答案,因为它提供了对 ctypes 的一些很好的见解,而且它目前也是投票率最高的答案。但是,我建议阅读所有答案以获得良好的概述。
再次感谢。
python - 为什么 ctypes WriteProcessMemory() 失败?
我一直试图让这个功能工作一段时间,但没有运气。
GetLastError() 返回 87 (0x57),即 ERROR_INVALID_PARAMETER。对于这个函数,我直接从 Justin Seitz 的 Gray Hat Python 中复制了它。不确定我做错了什么,ReadProcessMemory() 效果很好并返回适当的值。
对于地址,我现在选择一个随机位置,0x00050000,并传递像“\x61”这样的数据,在没有改变之前和之后读取位置。
我感觉这是一个简单的错误,在此先感谢您的帮助。导航。
虽然你是对的,但这是一件特权的事情。我似乎仍然无法弄清楚我在寻找什么。这是我的启动过程代码:
我需要以不同的方式创建流程吗?我应该在 SecDescriptor 结构中添加什么?MSDN 对 DACL 和 ACE 的帮助不是很大吗?感谢到目前为止的所有帮助。
PS - 只是一个想法,调试器或其他一些程序如何不产生进程并且能够改变内存?
python - 不能再使用 Python 2.6 C 接口,但 2.5 可以工作
我刚刚注意到我不能再使用 Python 2.6 dll。Python 2.5 工作得很好。
我做错了什么还是 Python 2.6 坏了?
更新
- 用 Python 2.7 alpha dll 试过这个,它似乎可以工作,所以它可能是 2.6 的问题。
- 在带有 Python 2.7 alpha 的 Ubuntu x64 上进行了尝试,并且没有出现分段错误。
c++ - Python ctypes 回调函数到 SWIG
我有一个 SWIG C++ 函数,它需要一个函数指针 (WNDPROC),并想给它一个由 ctypes.WINFUNCTYPE 包装的 Python 函数。
在我看来,这应该是兼容的,但是 SWIG 的类型检查会引发异常,因为它不知道 ctypes.WINFUNCTYPE 类型实际上是 WNDPROC。
我该怎么做才能将我的回调传递给 SWIG 以便它理解它?
python - Python ctypes CFuncType的地址
与我的另一个问题有关
如何获取 CFuncType 对象的地址(实际函数指针)?addressof() 不报告正确的地址。
C代码:
Python代码:
输出:
尝试从 C 调用 *(7030864) 会导致崩溃,但调用 *(3411932) 会按预期工作。addressof() 有什么问题?
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