首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Python中的ctype访问DLL返回的对象的内容

使用Python中的ctype访问DLL返回的对象的内容
EN

Stack Overflow用户
提问于 2018-11-18 18:16:14
回答 2查看 1.3K关注 0票数 2

dll在使用python中的ctype调用函数时返回一个对象。

它返回以下内容--假设它被命名为ReturnO;print(ReturnO)给出了以下内容:

代码语言:javascript
运行
AI代码解释
复制
(63484, <DLLname.ClassName object at 0x09D35670>)

对象应该返回参数;它们的名称是: Paramater_1、Parameter_2等等。我的问题是,如何访问Parameter_1、Parameter_2等中的值。

如果我按以下方式打印

代码语言:javascript
运行
AI代码解释
复制
print(ClassName.Parameter_1)
print(ClassName.Parameter_2)

我得到以下信息

代码语言:javascript
运行
AI代码解释
复制
 Field type=c_float_Array_5, ofs=49483, size=20
 Field type=c_float_Array_5, ofs=49503, size=20

现在,我如何获得这个数组中的值。dotValue (.value)不工作。

感谢你的帮助。谢谢。

----------------ADDED/MODIFIED----------BELOW

下面是代码,感谢您的帮助:

代码语言:javascript
运行
AI代码解释
复制
num1=10.1234
int1=10
num11=1.1111
str1=”abcd”

ret=GetOutput_Main(int1,num1,num11,str1)

class ClassName(ctypes.Structure):
  _pack_ = 1
  _fields_ = [("parameter_1", ctypes.c_float * 5),
              ("parameter_2", ctypes.c_float * 5)]

def GetOutput_Main (int2,num2,num22,str2):
    lib = ctypes.WinDLL("mydllname.dll")
    prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.c_uint32, ctypes.POINTER(ctypes.c_uint32), ctypes.POINTER(ClassName))
    paramflags = (1, "int2",), (1, "num2",), (2, "num22",), (2, "str2",),
    Getoutput_Sub = prototype(("Getoutput", lib), paramflags))
    ret = Getoutput_Sub(int2,num2)
    print(ret) #gives the details of the object
    print(str2.parameter_1) #gives the details of array

指纹(Ret)给我:

代码语言:javascript
运行
AI代码解释
复制
(63484, <mydllname.ClassName object at 0x09D35670>)

如果我打印(Str2),我会得到以下内容:

代码语言:javascript
运行
AI代码解释
复制
<class 'mydllname.ClassName'>

打印(str2.parameter_1)给了我

代码语言:javascript
运行
AI代码解释
复制
Field type=c_float_Array_5, ofs=49483, size=20

我正在寻找打开物品的方法,谢谢。

如果我这么做了,那么num22的大小

代码语言:javascript
运行
AI代码解释
复制
UnpackedST = struct.unpack(str2,num22)

我得到以下错误

代码语言:javascript
运行
AI代码解释
复制
Struct() argument 1 must be a str or bytes object, not _ctypes.PyCStructType
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-20 16:19:37

根据您的描述,您的C函数类似于以下内容:

test.c

代码语言:javascript
运行
AI代码解释
复制
#include <inttypes.h>

#ifdef _WIN32
#   define API __declspec(dllexport)
#else
#   define API
#endif

struct ClassName {
    float parameter_1[5];
    float parameter_2[5];
};

API int __stdcall Getoutput(int a, uint32_t b, uint32_t* pc, struct ClassName* pd) {
    int i;
    *pc = a + b;
    for(i = 0; i < 5; ++i) {
        pd->parameter_1[i] = i * .5f;
        pd->parameter_2[i] = i * .25f;
    }
    return a * b;
}

paramflags参数指示两个输入(类型1)和两个返回值(类型2)。只需传递两个所需的输入值,并将结果存储在一个元组中。您可以在数组上调用list()或切片来访问它们的元素。我提供了一个__repr__函数,这样类在打印时就可以显示自己了。

test.py

代码语言:javascript
运行
AI代码解释
复制
import ctypes as ct

class ClassName(ct.Structure):

    _fields_ = (('parameter_1', ct.c_float * 5),
                ('parameter_2', ct.c_float * 5))

    def __repr__(self):
        '''Return string describing how to print ClassName object.
        '''
        # Note that slicing an array produces a list of its elements.
        return f'ClassName({self.parameter_1[:]}, {self.parameter_2[:]})'

lib = ct.WinDLL('./test')
prototype = ct.WINFUNCTYPE(ct.c_int, ct.c_int, ct.c_uint32, ct.POINTER(ct.c_uint32), ct.POINTER(ClassName))
paramflags = (1, 'int2'), (1, 'num2'), (2, 'num22'), (2, 'str2')
Getoutput = prototype(('Getoutput', lib), paramflags)

pc, pd = Getoutput(10, 11)
print(f'{pc=} {pd=}')

输出:

代码语言:javascript
运行
AI代码解释
复制
pc=21 pd=ClassName([0.0, 0.5, 1.0, 1.5, 2.0], [0.0, 0.25, 0.5, 0.75, 1.0])
票数 2
EN

Stack Overflow用户

发布于 2018-11-19 22:58:54

如果您有一个ctype浮点数数组,则有各种方法来获取每个浮点数。

示例:

我们从一个简单的python浮动列表开始,只是为了演示:

代码语言:javascript
运行
AI代码解释
复制
>>> python_float_list = [1.5, 2.5, 3.5, 4.5, 5.5]  

从列表中创建一个ctype浮点数数组:

代码语言:javascript
运行
AI代码解释
复制
>>> import ctypes
>>> c_float_array = (ctypes.c_float * 5)(*python_float_list)
>>> c_float_array
<__main__.c_float_Array_5 object at 0x000001D6D9A66A48>

ctypes数组是可订阅的:

代码语言:javascript
运行
AI代码解释
复制
>>> c_float_array[0]
1.5
>>> c_float_array[1]
2.5

您也可以对它们使用for循环:

代码语言:javascript
运行
AI代码解释
复制
>>> for f in c_float_array:
    print(f)


1.5
2.5
3.5
4.5
5.5

由于ctype数组是可订阅的,您可以从它们获得一个python列表:

代码语言:javascript
运行
AI代码解释
复制
>>> list(c_float_array)
[1.5, 2.5, 3.5, 4.5, 5.5]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53367453

复制
相关文章
gridview列 数字、货币和日期 显示格式
在设置gridview等数据绑定控件的模版列时,总要设置显示的格式,这里是我查询一些资料后统计出来的。
Java架构师必看
2021/03/22
1.3K0
用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
数据库中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。
全栈程序员站长
2022/07/09
1.7K0
日期、时间、PosixTime 和时间戳数据类型
可以定义日期、时间和时间戳数据类型,并通过标准 SQL 日期和时间函数相互转换日期和时间戳。例如,可以使用 CURRENT_DATE 或 CURRENT_TIMESTAMP 作为使用该数据类型定义的字段的输入,或者使用 DATEADD、DATEDIFF、DATENAME 或 DATEPART 来操作使用该数据类型存储的日期值。
用户7741497
2022/08/02
1.8K0
MySQL数据类型--日期时间
  自接触学习MySQL已有一段时间了,对于MySQL的基础知识还是有一定的了解的。在这一路学习过来,每次不管看书还是网上看的资料,对于MySQL数据类型中的时间日期类型总是一扫而过,不曾停下来认认真真的研究学习。最近在图书馆借了一本关于MysQL的书籍,打算全面的学习研究一遍。
那一叶随风
2018/08/22
3.3K0
MySQL数据类型--日期时间
Oracle sqlldr 如何导入一个日期列
本文介绍了如何使用 Oracle 的 sqlldr 导入工具,将日期列正确地导入到目标表中。首先,作者介绍了如何使用 sqlldr 导入数据,并指出了在遇到日期列时需要采取的特殊处理方式。接下来,作者演示了如何使用 sqlldr 的控制文件来指定日期列的格式。通过使用这种控制文件,可以轻松地将日期列导入到目标表中。
用户1148526
2018/01/03
9480
日期和时间构造
这些构造采用 ODBC 日期、时间或时间戳格式的整数或字符串,并将其转换为相应的 IRIS 日期、时间或时间戳格式。他们执行数据输入以及值和范围检查。
用户7741497
2022/08/02
2.1K0
python日期和时间
python中常用的处理时间的模块有两个:time 模块、datetime 模块,time模块是比较基础的一个模块,可满足对时间类型数据的基本处理;而 datetime模块可以看做是 对time模块的一个高级封装,功能更加强大,例如在时间的加减上(获取指定时间的前(后)一天的时间,获取指定时间的前(后)一小时的时间),使用datetime模块,实现起来更为方便~
py3study
2020/01/03
2.3K0
python日期和时间
[快学Python3]日期和时间处理
概述 在python中, date、time、datetime类提供了一系列处理日期、时间和时间间隔的函数。 在Python里我们大致可以把其实现日期时间类分为5个: date 仅用于日期处理(年、月、日) time 仅用于时间处理(时、分、秒、毫秒) datetime 可以处理日期和时间的组合(年、月、日、时、分、秒、毫秒) timedelta 日期时间处理,可以用于时间运算等 tzinfo 用于时区处理 下面我们一起看几个实例来看看上述几个类的应用,在本文中不会列举所有的应用方法。 基础实例 直接上代码
苦叶子
2018/04/09
2.1K0
linux 时间和日期
date 查看系统时间(默认) date +“%Y-%m-%d %H:%M:%S” 查看系统时间(指定格式) date -s “时间字符串” 设置系统时间
云缓缓知我意
2021/04/15
4.3K0
Python 日期和时间
Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。
Python知识大全
2020/02/13
2K0
MySQL数据类型 -- 日期时间型
版权声明:本文为博主原创文章,欢迎扩散,扩散请务必注明出处。 https://blog.csdn.net/robinson_0612/article/details/82824107
Leshami
2018/09/28
8940
MySQL数据类型 -- 日期时间型
linux 日期转换时间戳_oracle日期转13位时间戳
4. 指定日期格式转换:date -d @1614592163 +”%Y-%m-%d %H:%M:%S”
全栈程序员站长
2022/11/11
6.3K0
js时间戳转换日期格式和日期计算
一、时间戳转换日期 1 function formatDate(datetime) { 2 // 获取年月日时分秒值 slice(-2)过滤掉大于10日期前面的0 3 var year = datetime.getFullYear(), 4 month = ("0" + (datetime.getMonth() + 1)).slice(-2), 5 date = ("0" + datetime.getDate()).
半指温柔乐
2018/09/11
29.3K0
为Qt程序获取编译日期时间
利用__DATE__与__TIME__编译宏特性为Qt程序添加编译日期时间。 static const QDateTime buildDateTime() { QString dateTime; dateTime += __DATE__; dateTime += __TIME__; return QLocale(QLocale::English).toDateTime(dateTime, "MMM dd yyyyhh:mm:ss"); } 另外,下列代码并不能获取编译日期时
Qt君
2019/08/05
2.7K0
MySQL日期和时间函数
WEEK(DATE):返回所给的日期是一年中的第几周 YEAR(DATE):返回所给的日期是哪一年 HOUR(time):返回所给时间的小时 MINUTE(time):返回所给时间的分钟
秋白
2019/02/21
4K0
MySQL日期和时间函数
Excel 日期和时间函数[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/168355.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/20
1.8K0
Excel 日期和时间函数[通俗易懂]
【mysql】日期和时间函数
GET_FORMAT函数中date_type和format_type参数取值如下:
兮动人
2022/03/15
4.8K0
[C#] 日期和时间库 NodaTime
Github:https://github.com/nodatime/nodatime(opens new window)
科控物联
2023/10/06
1.1K0
[C#] 日期和时间库 NodaTime
如何在PowerBI中同时使用日期表和时间表
首先,由于日期表和时间表不能叠加在一起(原因在前文说过了),所以肯定是两张表单独和事实表进行关联,而事实表中日期和时间是在同一列。
陈学谦
2020/07/01
8.8K0
如何在PowerBI中同时使用日期表和时间表
点击加载更多

相似问题

C# XML将数组字符串序列化/反序列化为数组元素名称

21

将xml序列化为c#类时出错

13

将字典序列化为XML C#

11

将C#表单序列化为XML

33

将c#类序列化为xml

32
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文