[DLL][Python] C++(またはC)言語のDLL作成と読出し

環境:Python2.7, Visual Studio Community 2015

概要

PythonでC言語(というかC++)の関数を呼び出すためのDLLの作成方法および呼 び出し方法について。

追記

検索の仕方が悪かったのか調べてもあまりいい情報が出てこなかったので 書いたのだが、調べてみる下記サイトなどPythonコードの書き方部分に関 して説明がかなり詳しい。なので、このページは主にWindowsのDLLの作製 法みたいな感じで...

http://curlnoodle.hatenablog.com/entry/2013/12/30/221858

WindowsにおけるC++製DLLファイルの作成

要約:

  1. DLL作成のためのプロジェクト設定
  2. extern "C" によるC関数としての宣言
  3. __declspec(dllexport) によるDLLとしての宣言

Linuxだとちょろっと書いたコードをスマートに作成できるらしいのだけれど も、WindowsでサクッとDLLを作成する方法がわからなかったのでVisual Studioのプロジェクトの設定から説明する。:

[ファイル] → [新規作成] → [プロジェクト]
とクリックしていき、新しいプロジェクトの作成ダイアログを開く。

[インストール済み] → [テンプレート] → [Visual C++]
をと左側のリストから選んでいき、真ん中のテンプレート選択部分で

[Win32コンソールアプリケーション]
を選び、適当な名前を付けて[OK]をクリック。
するとWin32アプリケーションウィザードなるものが始まる。

[次へ]
を押す。次の画面で

[アプリケーションの種類] → [DLL(D)]
を選択し、そのまま完了。

デフォルトで 作ったプロジェクト名.cpp みたいなファイルが開かれていると 思うがここに関数を記述すればOK。以下のような感じ。

extern "C" __declspec(dllexport) void test_dll() {
       std::cout << "this is the test";
}

キモは関数の前にある extern "C" __declspec(dllexport) という部分で ある。 extern "C" でこのコードをC言語でも利用できるようにコンパイ ルしてくださいねというような指令を出し、また __declspec(dllexport) をつけることで、「この関数はDLLの外部からもアクセスできますよ」という ことを教えている。多分。これをビルドすることで、無事外部に関数を公開し たDLLを作成することが出来た。

Pythonからの呼び出し

要約:

  • ctypes.cdll を利用して呼び出す

Pythonから呼び出すにはctypesとよばれるモジュールをインポートする必要が ある。そして、DLLをそのモジュールの関数を用いてインポートする必要があ る。例えば上に書いたような void test_dll() という関数を外部に公開 しているDLLの場合こんな感じで 読みだし → 呼び出し を行う。

# まず必要なモジュールのインポート
from ctypes import cdll
import ctypes

# DLLを読出し、pythonのオブジェクトとして扱えるようにして、変数へ代入
dll = cdll.LoadLibrary('./MyDll.dll')

# 別にやらなくてもいいけど関数にアクセスしやすいように取得
test_dll = dll.test_dll
# これで関数を単純に呼び出せる
test_dll()

上記の様にDLLの関数を呼び出すのは非常に簡単である。しかし、引数を取る 場合にはそう簡単にいかないこともあるので、それらに関しては以下の参考サ イト様よりご覧ください。

http://curlnoodle.hatenablog.com/entry/2013/12/30/221858

コメント

このブログの人気の投稿

gnuplot: グラフの色を変更する

[Linux] rsyncで進捗を確認する

gnuplotで縦線を引きたい