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

python - Python 2.6 中的 ctypes 帮助

我似乎无法让这段代码工作,我的印象是我做对了。

** 我尝试按照下面的建议将其更改为 MessageBoxA ** ** 我得到错误 :: **

0 投票
3 回答
3564 浏览

python - 如何在python中可靠地进行清理?

我有一些 ctypes 绑定,对于每个 body.New 我应该调用 body.Free。我绑定的库没有与其余代码隔离的分配例程(它们可以在任何地方调用),并且要使用几个有用的功能,我需要进行循环引用。

我认为如果我能找到一种可靠的方法将析构函数与对象挂钩,它就会解决。(如果他们在数据被删除之前给我回调,weakrefs 会有所帮助。

所以很明显,当我输入velocity_func时,这段代码会失败:

我还尝试通过weakrefs 来解决它,这些事情似乎变得更糟,只是在很大程度上更加不可预测。

即使我不输入velocity_func,至少在我这样做时会出现循环:

那么如何确保结构将被垃圾收集,即使它们是由共享库分配/释放的呢?

如果您对更多详细信息感兴趣,可以使用存储库:http: //bitbucket.org/cheery/ctypes-chipmunk/

0 投票
3 回答
2622 浏览

python - 一些有助于理解 libusb-1.0 和 ctypes 的异步 USB 操作

好的。我想到了。transfer.flags 需要是一个字节而不是一个 int。傻我。现在我从 ioctl 收到错误代码,errno 16,我认为这意味着设备正忙。真是个工作狂。我在 libusb 邮件列表上询问过。

以下是我到目前为止所拥有的。这实际上并没有那么多代码。其中大部分是 libusb 的 ctypes 结构。向下滚动到底部以查看发生错误的实际代码。

0 投票
1 回答
3340 浏览

python - USB - 同步 vs 异步 vs 半异步

更新:

我编写了一个异步 C 版本,它可以正常工作。

原来速度问题是由于 Python 的 GIL 造成的。有一种方法可以微调其行为。sys.setcheckinterval(间隔)

将间隔设置为零(默认为 100)可解决速度慢的问题。现在剩下的就是找出导致另一个问题的原因(并非所有像素都被填充)。这个没有任何意义。usbmon 显示所有通信都在进行。libusb 的调试消息没有显示任何异常。我想我需要获取 usbmon 的输出并比较同步与异步。usbmon 显示的数据乍一看似乎是正确的(第一个字节应该是 0x96 或 0x95)。

正如下面原始问题 S. Lott 中所说,它适用于 USB LCD 控制器。drv_send 有三个不同的版本,它是传出端点方法。我已经解释了下面的差异。如果我概述异步 USB 操作,也许会有所帮助。请注意,同步 USB 操作的工作方式相同,只是它是同步完成的。

我们可以将异步 I/O 视为 5 个步骤的过程:

  1. 分配:分配一个libusb_transfer(这是self.transfer)
  2. 填充:使用有关您希望执行的传输的信息填充 libusb_transfer 实例 (libusb_fill_bulk_transfer)
  3. 提交:要求 libusb 提交转账(libusb_submit_transfer)
  4. 完成处理:检查 libusb_transfer 结构中的传输结果(libusb_handle_events 和 libusb_handle_events_timeout)
  5. 释放:清理资源(下图未显示)

原始问题:

我有三个不同的版本。一个是完全同步的,一个是半异步的,最后一个是完全异步的。不同之处在于,同步完全填充了我正在控制的 LCD 显示器,并带有预期的像素,而且速度非常快。半异步版本只填充了一部分显示,但仍然非常快。异步版本真的很慢,只能填满一部分显示。我很困惑为什么像素没有完全填充,为什么异步版本真的很慢。有什么线索吗?

这是完全同步的版本:

这是半异步版本:

这是完全异步的版本。device_poll 本身就在一个线程中。

这是队列被清空的地方。这是 gobject 超时的回调。

这是转移的回调。它只是将锁定状态更改回 false,表示操作已完成。

0 投票
3 回答
18775 浏览

python - Python:使用 ctypes 访问 DLL 函数——通过函数 *name* 访问失败

myPythonClient(下)想要调用一个ringBell函数(使用 DLL 从 DLL 加载ctypes)。但是,尝试ringBell通过其名称访问会导致AttributeError. 为什么?

RingBell.h包含

RingBell.cpp包含

myPythonClient.py包含

0 投票
2 回答
2045 浏览

c - 实现外部函数接口的指南

现在我正在研究一种还没有 FFI 的脚本语言。我想知道最方便的获取方式是什么,假设我想像酷极客那样编写它——我想用脚本语言本身编写 FFI。

我需要接口的编程语言是 C。所以对于基础知识,我知道 libdl.so 是我最好的朋友。显然,这不是我唯一需要的东西,而是其中最重要的东西。

我对我还需要什么只有一点点想法。我想从 FFI 获得与 python ctypes 类似的行为。

为了做到这一点,我需要知道什么?我知道我需要处理的数据结构有一些严重的魔力。我该如何管理它,以便我可以在脚本语言本身中完成大部分严肃的魔法?我会从这种魔法中获得更多的用途,而不仅仅是外部函数接口。例如,我可能想将类似 C 的二进制数据传递给文件。

0 投票
3 回答
830 浏览

python - 在面向对象的 Python 中使用 ctypes 从 DLL 文件运行函数时出现问题

我当然希望这不是一个已经回答的问题或一个愚蠢的问题。最近我一直在用几种仪器编程。尝试在它们之间进行通信以创建测试程序。但是,当我尝试调用从仪器 DLL 文件中“屏蔽”出来的函数时,我遇到了一些特定仪器的问题。当我使用交互式 python shell 时,它可以完美运行(尽管它有很多单词破坏)。但是当我以面向对象的方式实现这些功能时,程序失败了,实际上它并没有失败,它只是什么都不做。这是第一个调用的方法:(导入了 ctypes 和 ctypes.util)

现在效果很好,一切都很完美,我得到了完美的日志条目。但是当我尝试在程序中进一步运行一个方法时,调用:

程序突然停止工作/继续运行,调用“self.maury”行时没有任何反应。当我将所有内容都放在 init_hardware 方法中时,它可以完美运行,所以我猜测存在轻微的内存“错误”或面向目标的结构。我真的希望它保持这种状态,无论如何以这种方式隔离功能?还是我必须将自己限制在一大段代码中?


编辑:
文档信息
[图例:星号表示指针,括号表示数组]

add_tuner 函数在调谐器驱动程序对象中添加或更新一个调谐器。

输出no_motors, max_range (array of three numbers), fmin, fmax, fcrossover,error_string (80+ characters long), function-return->Error flag



add_controller 函数在调谐器驱动对象中添加或更新一个控制器

输出error_string, function-return->Error flag

0 投票
6 回答
2898 浏览

python - IO完成端口key混淆

我正在使用 ctypes 模块在 Python 中使用 Windows DLL API编写基于 IO 完成端口的服务器(此处为源代码)。但这是 API 的一个非常直接的用法,这个问题是针对那些了解 IOCP 而不是 Python 的人。

据我了解 CreateIoCompletionPort 的文档,当您使用与创建的 IOCP 关联的文件句柄(在我的情况下为套接字)调用此函数时,您指定了“用户定义的”完成键。当您开始调用 GetQueuedCompletionStatus 时,您将获得一个完成键值以及一个指向重叠对象的指针。完成键应标识已完成的重叠对象和请求。

但是,假设我在 CreateIoCompletionPort 调用中使用重叠对象传入 100 作为完成键。当同一个重叠对象的 IO 完成并通过 GetQueuedCompletionStatus 返回时,伴随它的完成键要大得多,与原始值 100 没有任何相似之处。

我是否误解了完成键的工作原理,还是我在上面链接的源代码中做错了?

0 投票
3 回答
2242 浏览

python - python ctype递归结构

我已经为 C 中的驱动程序开发了一个 DLL。我用 C++ 编写了一个测试程序,并且 DLL 工作正常。

现在我想使用 Python 与这个 DLL 交互。我已经成功隐藏了大部分用户定义的 C 结构,但有一点我必须使用 C 结构。我对python很陌生,所以我可能会出错。

我的方法是使用 ctype 在 python 中重新定义一些结构,然后将变量传递给我的 DLL。但是在这些类中,我有一个自定义链表,其中包含以下递归类型

这失败了,因为在 EthercatDatagram 内部,尚未定义 EthercatDatagram,因此解析器返回错误。

我应该如何在 python 中表示这个链表,以便我的 DLL 正确理解它?

0 投票
2 回答
911 浏览

python - 如何将 ctype 指针读取/复制到 python 类中?

如果这可以帮助您,这是我上一个问题的后续行动。

我正在定义一些 ctype 结构

请注意,这是由 python 正确解析的,缺少的类在其他地方定义。我的问题是当我调用以下代码时

这是不正确的。据我了解,数据是某种指针,因此它没有(真正)映射到 EthercatDatagram,因此,解析器不知道底层的标头字段。

是否有某种方法可以读取该字段以及 POINTER() 表示的任何其他字段?