pythonでC++書き込みを呼び出すダイナミックライブラリ
一、環境:Windows XP+Python 3.2
1.dll対応ソースファイル(m.cpp):
2.pythonソース:
出力の実行:
二、環境:Fedora 12+Python 2.6
1.ダイナミックライブラリソースファイル(a.cpp):
コンパイル命令:
g++ -shared -o liba.so a.cpp
2.pythonソースプログラム(del.py):
実行結果:windowsバージョンとほぼ同じです!
結論:Linux上でPythonでダイナミックライブラリをロードする場合、デフォルトはシステムlibパスの下からライブラリファイルを検索します.したがってpythonで現在のパスの下にあるダイナミックライブラリをロードする場合は、パスに「./liba.so」と書きます.そうしないと、ダイナミックライブラリファイルが見つからないことを示すメッセージが表示されます.
1.dll対応ソースファイル(m.cpp):
#include <stdio.h>
extern "C"
{
_declspec(dllexport) int add(int a, int b)
{
return a+b;
}
_declspec(dllexport) void print_sum(unsigned long ulNum)
{
while(ulNum != 0)
{
printf("The ulNum is : %u
", 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
8
The 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>
二、環境:Fedora 12+Python 2.6
1.ダイナミックライブラリソースファイル(a.cpp):
#include <stdio.h>
extern "C"
{
int add(int a, int b)
{
return a+b;
}
void print_sum(unsigned long ulNum)
{
while(ulNum != 0)
{
printf("The ulNum is : %u
", 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("
Use time: %s" %t) #
実行結果:windowsバージョンとほぼ同じです!
結論:Linux上でPythonでダイナミックライブラリをロードする場合、デフォルトはシステムlibパスの下からライブラリファイルを検索します.したがってpythonで現在のパスの下にあるダイナミックライブラリをロードする場合は、パスに「./liba.so」と書きます.そうしないと、ダイナミックライブラリファイルが見つからないことを示すメッセージが表示されます.