一、環境:windows xp + python3.2
1. dll對應的原始檔(m.cpp):
#include extern "c"
_declspec(dllexport) void print_sum(unsigned long ulnum) }
}
2. python源程式:
# coding=gbk
from ctypes import *
import time
if __name__ == '__main__':
time_begin = time.clock()
#dll = cdll("d.dll") # 載入dll方式一
dll = cdll.loadlibrary("d.dll") # 載入dll方式二
print(dll.add(2, 6)) # 呼叫dll中add方法
dll.print_sum(100) # 呼叫dll中print_sum方法
t = time.clock() - time_begin # 計算時間差
print("use time: %f" %t) # 列印耗時時間
執行輸出:
e:\program\python>del
8the ulnum is : 100
the ulnum is : 99
the ulnum is : 98
...........
the ulnum is : 2
the ulnum is : 1
use time: 0.003853
e:\program\python>
二、環境:fedora12 + python2.6
1. 動態庫原始檔(a.cpp):
#include extern "c"
void print_sum(unsigned long ulnum) }
}
編譯指令:
g++ -shared -o liba.so a.cpp
2. python源程式(del.py):
#!/usr/bin/env python
# coding=utf-8
from ctypes import *
import time
if __name__ == '__main__':
time_begin = time.clock()
dll = cdll("./liba.so") # 載入dll方式一(預設在系統lib庫路徑下查詢.so檔案)
#dll = cdll.loadlibrary("./liba.so") # 載入dll方式二
print(dll.add(2, 6)) # 呼叫dll中add方法
dll.print_sum(10000) # 呼叫dll中print_sum方法
t = time.clock() - time_begin # 計算時間差
print("\nuse time: %s" %t) # 列印耗時時間
執行結果:與windows版本基本相同!
結論:linux上用python載入動態庫時預設是從系統lib路徑下是查詢庫檔案的。所以在python中載入當前路徑下的動態庫的話,路徑要寫「./liba.so",否則會提示動態庫檔案找不到!
C呼叫自己寫的動態庫
自己做了libhello.so庫後,寫了個簡單的測試 將測試 和庫檔案放到了同一路徑下,gcc main.c l.lhello,結果執行後報錯,a.out error while loading shared libraries libhello.so cannot open shared obje...
Python 呼叫 C 動態庫
呼叫c庫而不是c 庫 要注意平台位數對應 解釋型語言自上而下執行 函式類似標籤,縮排表示 塊 一行一條語句時可以不用分號 如何分配一段記憶體等 test python sample 輸入輸出 print hello end print python string input 請輸入 print 你輸...
python呼叫C語言動態庫
python完美相容c語言,有了ctypes 可以呼叫c相關 如果是c 編譯的時候加上 extern c 就可以了 如果是一些複雜型別比如結構體,類,聯合一些 可以考慮用boost.python exp.c include int add int a,int b 編譯生成動態庫add.so gcc ...