2012年3月8日木曜日

python mapserver-6.0.2 mapscript layerObj NameError

MapServerの調査をしています。 SWIG MapScript APIのpython版にバグがあるようです。 以下のようなコードを書くと、例外が発生します。
>>>import mapscript

>>>map = mapscript.mapObj('./x.map')
>>>layer = mapscript.layerObj(map)
Traceback (most recent call last):
  File "", line 1, in 
  File "/usr/local/lib/python2.7/site-packages/MapScript-6.0.2-py2.7-linux-x86_64.egg/mapscript.py", line 1381, in __init__
    if args and len(args)!=0:
NameError: global name 'args' is not defined

mapscript.pyをのぞいてみると、確かに"args"という変数は未定義です。
class layerObj(_object):
    __swig_setmethods__ = {}
    __setattr__ = lambda self, name, value: _swig_setattr(self, layerObj, name, value)
    __swig_getmethods__ = {}

    # 略

    def __init__(self, map = None):
        this = _mapscript.new_layerObj(map)
        try: self.this.append(this)
        except: self.this = this
        if 1:
                 if args and len(args)!=0: #'args' is not defined!
                       self.p_map=args[0]
                 else:
                       self.p_map=None

    # 略

しょうがないので、以下のように修正し、python-mapscriptをインストールしなおしました。
class layerObj(_object):
    __swig_setmethods__ = {}
    __setattr__ = lambda self, name, value: _swig_setattr(self, layerObj, name, value)
    __swig_getmethods__ = {}

    # 略

    def __init__(self, map = None):
        this = _mapscript.new_layerObj(map)
        try: self.this.append(this)
        except: self.this = this
        #if 1:
        #         if args and len(args)!=0: #'args' is not defined!
        #               self.p_map=args[0]
        #         else:
        #               self.p_map=None
        self.p_map = map
    # 略
これで一応動きました。 追記: classObjのコンストラクターも同様に修正が必要でした。 あと、既知のバグみたいです。 MapServer Issue Tracker "MapScript classObj Error" http://trac.osgeo.org/mapserver/ticket/3940