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

 <转帖子请注明出处>python

程序员的两极分化:

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

 

②我的编制一些对工做有帮助的软件。这类软件并不要求很高的安全性。方便快捷是它的特色。这类程序员因此的编程语言不少,不少语言都懂一些,但不专精。数据库

 

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级的编译水平嘛。

 

但愿可以对您的编程起到帮助做用!

相关文章
相关标签/搜索