lxml + mod_python: cannot unmarshal code objects in restricted execution mode

Dmitri Fedoruk dfedoruk at gmail.com
Thu Sep 13 15:05:58 CEST 2007


Hello everyone,

I'm developing a mod_python application that is based on XML\XSLT
transforming.

I used 4Suite libraries for that, but as the speed was unacceptable
for me, I switched to lxml. Everything became much easier and 10 times
faster, but I've encountered the subject problem.

In brief - all my data and xslt are stored and transferred in UTF-8.
With 4Suite everything was fine all the time. With lxml it works fine
from the console, but inside mod_python it occasionaly dies, ~ one
time out of three. Strange - the same code with the same data works or
dies by its own means.

As far as I have found, there was a similar problem with PyXML and
encodings module, but there was no clear solution.

So, my configuration is the following:
Python 2.5.1
Server version: Apache/2.2.4 (FreeBSD)
mod_python-3.3.1

And the relevant parts of my code are these:

def extApplyXslt(xslt, data, logger ):
    try:
        strXslt = urllib2.urlopen(xslt).read()
        # i have to read the xslt url to the python string
    except urllib2.HTTPError, e:
       .......
    except urllib2.URLError, e:
       .............
    try:
        xslt_parser = etree.XMLParser()
        xslt_parser.resolvers.add( PrefixResolver("XSLT") )

        # and now I have to use the string; a more elegant solution,
anyone?
        f = StringIO(strXslt)
        xslt_doc = etree.parse(f, xslt_parser)

        # and here where the problem comes
        transform = etree.XSLT(xslt_doc)

    except Exception, exc:
        logger.log(logging.CRITICAL, exc.__str__() )

    try:
      result_tree = transform(data)
      return etree.tostring(result_tree, 'utf-8')
    except Exception, exc:
      print "xslt processing error!", exc.__str__()
      return ""

It dies with the message 'cannot unmarshal code objects in restricted
execution mode'. By profiling I detected the point where problem
occurs:
 transform = etree.XSLT(xslt_doc)

So, I would be grateful for any suggestions how to get rid of this.
I'd really like to use lxml. Maybe I should initialize the xslt
processor in somehow other way?

Thanks in advance,
Dmitri




More information about the Python-list mailing list