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級的編譯水平嘛。

 

但願可以對您的編程起到幫助做用!

相關文章
相關標籤/搜索