IronPythonでは、Win32 APIを直接呼び出すことはサポートされていない(ActiveXやCOMライブラリを呼び出すサポートは存在する)。
一方CPythonの場合、Win32 APIを呼び出すには、以下に挙げるctypesライブラリとWindowsエクステンションライブラリをインストールすれば良い(それぞれ導入用実行ファイルが配布されている)。そこでここでは、cextライブラリを経由してctypes/Windowsエクステンションを呼び出すことで、IronPythonからWin32 APIを直接呼び出してみよう。
・ctypes(DLLをバインドして呼び出すためのライブラリ。2008年2月8日現在の最新版はバージョン1.0.2)
・Python for Windows extensions(主なWin32 API/COM呼び出しを行うライブラリ。2008年2月8日現在の最新版はビルド210)
まずはwin32エクステンションから、MessageBeep関数とMessageBox関数を呼び出す(リスト3、画面4)。
リスト3: win32エクステンションから、MessageBeep関数とMessageBox関数を呼び出す
# -*- coding:cp932 -*-
import clr
from System import *
from embedding import Import
sys = Import('sys')
sys.path.append('C:\\Python24\\Lib')
sys.path.append('C:\\Python24\\Lib\\site-packages')
win32gui = Import('win32gui')
print "MessageBeepを呼び出す"
Console.ReadKey()
win32gui.MessageBeep(0)
print "MessageBoxを呼び出す"
Console.ReadKey()
win32gui.MessageBox(0, "Hello IronPython", "test", 0)
画面4: リスト3実行結果 |
次は、ctypesライブラリから、同じくMessageBeep関数とMessageBox関数を呼び出してみる(リスト4、画面5)。
リスト4: ctypesライブラリから、同じくMessageBeep関数とMessageBox関数を呼び出してみる
# -*- coding:cp932 -*-
import clr
from System import *
from embedding import Import
sys = Import('sys')
sys.path.append('C:\\Python24\\Lib')
sys.path.append('C:\\Python24\\Lib\\site-packages')
ctypes = Import('ctypes')
print "MessageBeepを呼び出す"
Console.ReadKey()
ctypes.windll.user32.MessageBeep(0)
print "MessageBoxを呼び出す"
Console.ReadKey()
ctypes.windll.user32.MessageBoxW(0, "Hello IronPython", "test", 0)
画面5:リスト4実行結果 |
ご覧の通り、cextライブラリを経由することで、Win32 APIを簡単に呼び出せることがわかる。
また、サンプルコードをそれぞれよく見てもらうとわかるが、キー入力判定に、.NET FrameworkのライブラリにあるConsole.ReadKey()メソッドを呼び出している。
- 片や、.NETのライブラリを呼び出しつつ
- 片や、CPythonのライブラリを呼び出す
という、Pythonの糊言語としての有用性を感じ取っていただけるだろう。
まとめ
CPython Extensions for IronPythonライブラリにより、IronPythonは、CPythonの資産をほとんどそのまま継承できるようになったといえるだろう。面白いのは、
- IronPythonから、最新のソフト技術(.NET)を用いつつ
- CPythonから(cextライブラリを使いつつ)も、過去の多くの資産を活用
の2点が行えることだ。
ソフトウェア開発は、積み木細工のように例えられることがある。それは、今まで積み上げてきたコードや知識を基に、注意深く、慎重に、さらなる高み(それはモノであり知識である)を目指すことから想定されるのであろう。
「自身が持つソフトウェア資産を活用しつつ、新しい事に挑戦したい時、このようなライブラリを活用する方法もあるのだ」ということを知っていただけると幸いである。