モジュール(プラグイン、パッケージともいうのかな)を利用するpythonスクリプトを配布する際に、それを実行する前にパッケージが使えるかどうかをチェックしてあげると親切ですね。python自体が出すエラーでも分かる人にはわかるのですが、きちんとしたスクリプトを作りたい場合はやっぱりきちんとしたい。
調べてみると、さすが、きっちり調べてる方がいました。日本語の情報はほぼ唯一と言っていいんじゃないかと思った。
利用可能なモジュール一覧を取得する - Study08.net 対シンバシ殲滅用人型機動兵器
これを参考にクラスを作ってみました。参考にというかほぼそのままですが。
checkModule.py
#/usr/bin/python # -*- coding:utf-8 -*- import pydoc import string class checkModule: def __init__(self): self.modules = [] pydoc.ModuleScanner().run(self.__callback, onerror=self.__onerror) def list(self): return self.modules def find(self, target): return target in self.modules def match(self, target): mods = [] for mod in self.modules: if string.find(mod, target) >= 0: mods.append(mod) return mods def __callback(self, path, modname, desc, modules=None): if modname and modname[-9:] == '.__init__': modname = modname[:-9] + ' (package)' if string.find(modname, '.') < 0: self.modules.append(modname) def __onerror(self, modname): self.__callback(None, modname, None)
main.py
#/usr/bin/python # -*- coding:utf-8 -*- from checkModule import * if __name__ == '__main__': c = checkModule() print c.find("math") print c.match("com") print len(c.list())
python main.pyの実行結果
True ['command', 'command', 'commands', 'compileall', 'compiler', 'py_compile', 'rlcompleter', 'sre_compile'] 344