python中呼叫C 寫的動態庫

2021-06-05 09:32:24 字數 1813 閱讀 9894

一、環境: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 ...