美文网首页python加油站
关于python对dll文件的调用

关于python对dll文件的调用

作者: chen_sheng | 来源:发表于2017-10-17 17:56 被阅读38次

注:

1,python在linux系统下和在windows系统下调用是不同的,在linux下调用的文件是os文件,公司用windows做开发,所以我调用的是windows下的dll文件。

2,生成dll库需要用release,debug模式在调试状态调用的话需要引入外部文件,所以一定要用release生成dll文件。

3,在能够调用dll文件之后还可能出现编码问题的时候的处理方法,例如gbk的编码模式如何在转成utf8的中文格式的情况下保持调用不出现错误,详细解释看文章最后。

下面我介绍一下生成dll文件的顺序:

创建dll文件:

然后写dll文件:

接下来用c语言包装dll文件调用函数:

extern "C" _declspec(dllexport) int add(int a, int b);

对应的c封装的函数类似下面:

int add(int a, int b)

{

int c = a + b;

return c;

}

最后一步,利用python的ctypes库调用dll文件就行了:

注意:由于编码格式和系统位数的不同,可能会出现错误,我们进行相应的处理就行。

一般情况下:

from ctypes import *

dll= CDLL("Api.dll")

dll.add(args)

这样调用就行了

1但是会出现编码出错的问题:

比如报这样的错误,

TypeError: bytes or integer address expected instead of str instance

那么我们应该对参数进行处理一下如下:

args = c_char_p(b"C:\dll")

参数的格式用字符串等转换一下就行啦,

然后就会这样:

Process finished with exit code 0

这样就调用成功了。

2 也可能出现这样的问题:

报错无法加载64位的文件格式,

那么我们可以在系统里下载一个32位的python解释器,环境配置下改为使用32位的操作就解决了。

由于很多调用的dll文件是32位的操作系统的格式,那么我们就提供了一种跨系统的解决方法。

**在文章开头我们提出了一个问题,也是题主经过不断摸索最终解决的问题。

    首先这是一个编码问题,有史以来编码的格式对中国人非常的不友好,应为有比较多的编码问题了,那我们遇到了这些编码问题,又非常妨碍我们工作,比如在我们的调用dl文件的过程当中,会遇到一个dll文件的默认传入参数是gbk格式的,但是我们的编辑器是utf8的格式进行编码字节的,那么我们就遇到了这个问题,这个时候,我们输出的时候会有乱码,是因为在gbk的格式下会有一种默认的协议就是utf8也是能正常的传入当作参数的,但是返回的值就不那么友好了,返回的值还是gbk格式的,这样就需要我们手动的改一下输出参数的编码格式。

    当我们默认的输入进去格式被系统自动转编码的时候,就会造成一种编码的假象,我们需要知道其中的原理,才能对特定的问题进行针对性解决。

以上就是我在用python调用dll文件时遇到的问题和解决方案,希望对读者有用。

谢谢观看。

相关文章

网友评论

    本文标题:关于python对dll文件的调用

    本文链接:https://www.haomeiwen.com/subject/qroduxtx.html