#! /usr/bin/env python
#-----------------------------------------------------------------------------
# Modeling Framework: an Object-Relational Bridge for python
#
# Copyright (c) 2001-2004 Sbastien Bigaret <sbigaret@users.sourceforge.net>
# All rights reserved.
#
# This file is part of the Modeling Framework.
#
# This code is distributed under a "3-clause BSD"-style license;
# see the LICENSE file for details.
#-----------------------------------------------------------------------------
"""
compile_model.py
``Compile'' an xml_model into two python modules, model_<modelName>.py and
model_<modelName>_pickled.py:
- model_<model_name>.py: contains the whole xml-file in a single module
attribute: model_src
- model_<modelName>_pickled.py: the second one contains a single attribute
as well: model_pickle, which is a raw string to be loaded by
cPickle.loads()
Storing the model in a python file make it easier to install a package and
its model using distutils. Storing the pickled version accelerates the
loading of a model.
Written by: Sebastien Bigaret
"""
import sys, getopt
def loadModel(xmlFilePath):
"""
Creates a python module (file: model_<modelName>.py) and dumps the
content of the file 'xmlFilePath' in a string attribute named 'model_src'
"""
from Modeling import ModelSet
ms=ModelSet.ModelSet()
ms.addModelFromXML({'file': xmlFilePath})
model=ms.models()[0]
model._modelSet=None
return model
def write_xml_model_in_python_module(xmlFilePath, modelName):
"""
Creates a python module (file: model_<modelName>.py) and dumps the
content of the file 'xmlFilePath' in a string attribute named 'model_src'
"""
xml=open(xmlFilePath, 'r')
file=open('model_%s.py'%modelName, 'w')
file.write('model_src="""')
s=xml.readline()
while s!='':
file.write(s)
s=xml.readline()
file.write('"""\n')
xml.close()
file.close()
def write_pickled_model(model):
"""
Creates a python module (file: model_<modelName>_pickle.py) and dumps a
pickled version of the supplied model in module's attribute 'model_pickle'.
"""
import cPickle
file=open('model_%s_pickle.py'%model.name(), 'w')
file.write('model_pickle=r"""')
pickled=cPickle.dump(model, file)
file.write('"""\n')
file.close()
def usage(prgName, exitStatus=None):
print """%s <model.xml>
``Compile'' an xml_model into two python modules, model_<modelName>.py and
model_<modelName>_pickled.py.
- model_<model_name>.py: contains the whole xml-file in a single module
attribute: model_src
- model_<modelName>_pickled.py: the second one contains a single attribute
as well: model_pickle, which is a raw string to be loaded by
cPickle.loads()
Options
-------
-h Prints this message
""" % prgName
if exitStatus is not None:
sys.exit(exitStatus)
def main(argv):
me=argv[0]
try:
options, args = getopt.getopt(sys.argv[1:], 'h')
except getopt.GetoptError,msg:
print me, msg
usage(me, 1)
verbose=0
for k, v in options:
if k=='-h': usage(me, 0)
if len(args)!=1:
usage(me,1)
model=loadModel(args[0])
write_xml_model_in_python_module(args[0], model.name())
write_pickled_model(model)
if __name__ == "__main__":
main(sys.argv)
|