pythonでC++書き込みを呼び出すダイナミックライブラリ


一、環境:Windows XP+Python 3.2
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」と書きます.そうしないと、ダイナミックライブラリファイルが見つからないことを示すメッセージが表示されます.