Pythonでネットワーク上のコードをインポートする

impモジュールを使うと自前のimportを記述できそうだということがわかったので、試しにはてなダイアリーに簡単なソースコードをアップロードしてPCのローカルにあるファイルからインポートして関数を実行させてみました。
実装にはhttp://antas.jp/blog/yamakawa/2008/03/python_1.htmlを引用させてもらいました。

まずはネットワーク上においたソースファイル。

def greeting(name):
    print "Hello, %s!" % name

次にそのファイルをインポートするソースコード

# coding: utf-8

import imp
def import_from_string(name, code_str,  default_dict = {}):
    # ref: http://antas.jp/blog/yamakawa/2008/03/python_1.html
    """
        create module from string.
    """
    mod = imp.new_module(name)
    
    mod.__dict__.update(default_dict)
    mod_dict = mod.__dict__
    mod_dict["__source__"] = code_str
    
    if not mod_dict.has_key("__builtins__"):
        import __builtin__
        mod_dict["__builtins__"] = __builtin__
    
    # eval code_str in new  module context.
    exec code_str in mod_dict
    
    return mod

import urllib
conn = urllib.urlopen("http://d.hatena.ne.jp/yatt/files/greeting.py?d=y")
greeting = import_from_string("greeting", conn.read())
greeting.greeting("yatt")

実行結果

Hello, yatt!

__import__を上書きして、ネットワーク上にホスティングされた外部モジュールを透過的にインポートできるような仕組みを作れると便利そう。