インストール済のpythonモジュールを取得するクラス

モジュール(プラグイン、パッケージともいうのかな)を利用する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