pygtkの前にXvfbを起動する

pywebkitgtkとPILでWebページのサムネイル作成 - ラシウラでは、gtkのためにxvfb-run経由で呼び出しました。

いちいちxvfb-runを呼ぶのも面倒です。gtkモジュールを読み込む前にスクリプト中でXvfbを立ち上げたら、どうか試したところ、うまくできたようです。

Xvfb起動関数vfb()

Python標準のsubprocessモジュールのPopenを使って、Xvfbを起動させる関数です。
振舞い方は、xvfb-runを模倣してます。

def vfb(display_spec="1024x768x24", server=0, screen=0, auto_screen=True):
    """
    run Xvfb and set DISPLAY env
    """
    import subprocess
    import os
    while True:
        try:
            devnull = open("/dev/null", "w")
            proc = subprocess.Popen(
                ["Xvfb", ":%d" % server,
                 "-screen", "%d" % screen, display_spec],
                shell=False, stdout=devnull, stderr=devnull)
            os.environ["DISPLAY"] = ":%d.%d" % (server, screen)
            return (proc, screen)
        except:
            #import traceback
            #traceback.print_exc()
            if not auto_screen: break
            screen += 1
            pass
        pass
    pass

使い方は以下のような感じです。

proc, screen = vfb()
import gtk
...
proc.terminate()

例: webkitscreenshot.py

getscreenshot.pyをモジュールとしても使えるように書き直しました。