FREEBASIC 编译可被python调用的dll函数示例

自古美人都是妖i 提交于 2019-12-02 08:23:16

 <转帖子请注明出处>

程序员的两极分化:

①软件专业性加强。许多的软件都要做软件工程,要团队进行合作开发,单打独斗已经无法开发出功能很强的软件;这类程序员对某个编程软件要非常精通,但对其他的软件

 

②个人编制一些对工作有帮助的软件。这类软件并不要求很高的安全性。方便快捷是它的特点。这类程序员所以的编程语言很多,很多语言都懂一些,但不专精。

 

Python

Python在工作中用的很多:扩展库较多、语法简洁、可以边用边写脚本、可以非常的方便。

但是有一个问题很让人困扰:要进行大规模的数据计算的时候,运行时间太长让人难以忍受。

网上查找了很多的资料,有很多的加快python的方法:

+ pysco: 好像速度提升不错,但是2.7以上不再支持,主要原因是它太占用资源,所以python社区把它给放弃了;

+ pypy:另外再搞一个python? NO! 很明显,我要放弃很多CPYTHON中支持的资源。

+cython: 这货基本就是C语言语法、python语法的综合体。同时考虑两种语言,写程序的时候是不是更容易出错?放弃。

 

 

Freebasic

这个是让我兴奋而有伤感的语言。

兴奋的理由:FreeBasic支持东西太多了:跨平台、语法基本同传统的BASIC,不存在语言上的学习难度、支持指针、支持类(简易)、动态库dll,so编写、编译速度快、运行速度快(GCC相当)、帮助文件非常全面,几乎所有问题在帮助文件上可以找到、持库很多:图形、数据库、游戏等等。简单来说,这货就是一个basic语法的C语言

伤感的理由:这么功能全面,体积很小的软件在国内竟然看不到有热闹的论坛!但是国外却有不少。好像国内程序猿的素质都很高,都去做网络应用去了,不屑于搞这个了(好吧,看看现在国内软件体积有多么庞大就知道了)。

好的,下面它就要出场了。看看它是多么的简洁,强大!

 

好吧,我考虑的思路还是让python直接调用底层的dll来加快速度。网上也有不少这样的示例。用ctypes调用C编写的dll动态库。

如果你对C非常精通,那就跳过;如果你想更简单一点的话,就看我的示例吧。

Freebasic 的 函数编制中加入 “export”关键字就可以导出一个标注的.dll,.so库了。

程序如下:

 

以下文件名称为dll.bas

 

 

 

'1.函数test
 
Function test Cdecl Alias "test"( byval operand1 as integer, byval operand2 as integer ) as integer export
    'OK!-按值传递
    '调用示例
    'from ctypes import * 
    ' 
    '#libtest=CDLL("D:\pythonUser\dll.dll")   
    'libtest=cdll.LoadLibrary("D:\pythonUser\dll.dll") 
    'print libtest.test(10,12)
    '结果为-2
    '
    Return  operand1 - operand2
 
end Function
 
'2.函数test3
 
Function test3 Cdecl Alias "test3"(  operand1 as integer,  operand2 as integer ) as integer export
    'OK!-按地址传值
    '调用示例
    'from ctypes import * 
    ' 
    '#libtest=CDLL("D:\pythonUser\dll.dll") 
    'libtest=cdll.LoadLibrary("D:\pythonUser\dll.dll") 
    'print libtest.test3(10,12)
    '结果为-2
 
     Return operand1 - operand2
 
end Function
 
'3.函数test2
 
Function test2 Cdecl ( byval operand1 as integer, byval operand2 as integer ) as integer export
    ' 错误:导出函数没有别名“alias”,无法被python找到函数名
    ' ctypes 导入时正确
    ' 但是调用 print libtest.test2(10,12)时,无法找到函数名
    ' Traceback (most recent call last):
    '----------python 错误列表---------------------
    '  File "<stdin>", line 1, in <module>
    '  File "C:\Python27\lib\ctypes\__init__.py", line 378, in __getattr__
    '    func = self.__getitem__(name)
    '  File "C:\Python27\lib\ctypes\__init__.py", line 383, in __getitem__
    '    func = self._FuncPtr((name_or_ordinal, self))
    '   AttributeError: function 'test2' not found
    '-----------------------------------------------
    Return operand1 - operand2
 
end Function

 

'编译:

 

 'C:\Program Files\FreeBASIC\fbc -s gui -dll -export "dll.bas"

'生成 dll.dll 链接库

 

把dll.dll文件放到 c:\python27 安装目录下,

 

from ctypes import *
libtest=CDLL("dll.dll")
print libtest.test(10,12)

也同样可以!

 

你看是不是很简单?可以说是完美!

 

经测试,同样的代码,dll可以提高5倍左右的速度。毕竟是GCC级的编译水平嘛。

 

希望能够对您的编程起到帮助作用!

 

 

 

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!