Dominique.Holzwarth at ch.delarue.com
Dominique.Holzwarth at ch.delarue.com
Tue Apr 1 05:09:15 EDT 2008
Hey Guys I was just playing around with the cPickle module to save some instance objects into binary files and 'offline' (normal python interpreter on local machine) it all works fine. However, when I try to do the same things under apache with mod_python I get a mod_python specific error... Here are my testing files: Pickletest.py ******************************************************************************************************************* from mod_python import apache from mod_python import Session import cPickle, pickle myModule = apache.import_module('~/test/dummyclass.py') secretText = "hallo" def index(req): req.session = Session.FileSession(req, secret=secretText) if req.session.is_new(): myInstance = myModule.myClass() myInstance.hit() hits = str(myInstance.hitCounter) myOtherInstance = myModule.myOtherClass() myOtherInstance.hit() randNum = str(myOtherInstance.randomNumber) file = open('C:\\Program Files\\Apache Software Foundation\\Apache2.2\\test\\myInstances.pkl','wb') cPickle.dump((myInstance, myOtherInstance), file) file.close() req.session.save() return "Hits: "+hits+" Random Number: "+randNum else: file = open('C:\\Program Files\\Apache Software Foundation\\Apache2.2\\test\\myInstances.pkl','rb') (myInstance, myOtherInstance) = cPickle.load(file) file.close() myInstance.hit() myOtherInstance.hit() hits = str(myInstance.hitCounter) randNumber = str(myOtherInstance.randomNumber) req.session['myInstances'] = (myInstance, myOtherInstance) file = open('C:\\Program Files\\Apache Software Foundation\\Apache2.2\\test\\myInstances.pkl','wb') cPickle.dump((myInstance, myOtherInstance), file) file.close() req.session.save() return "Hits: "+hits+" Random Number: "+randNum+" old session" ******************************************************************************************************************* This script does nothing more than saving / loading instance objects and displaying some sort of 'hit counter' Dummyclass.py ******************************************************************************************************************* import random class myClass: def __init__(self): self.attribute = 1 self.text = "hello world" self.hitCounter = 0 def hit(self): self.hitCounter += 1 class myOtherClass: def __init__(self): self.otherAttribute = 2 self.otherText = "goodbye world" self.randomNumber = 0 def hit(self): self.randomNumber = random.randint(0, 1000) ******************************************************************************************************************* Defines some useless classes, of which instance objects should be stored :-) The script manages to write the *.pkl file which looks like this: myInstances.pkl ******************************************************************************************************************* ((i_mp_bee88a136571a696398a0eb82b06eeb3 myClass p1 (dp2 S'attribute' p3 I1 sS'hitCounter' p4 I1 sS'text' p5 S'hello world' p6 sb(i_mp_bee88a136571a696398a0eb82b06eeb3 myOtherClass p7 (dp8 S'otherText' p9 S'goodbye world' p10 sS'otherAttribute' p11 I2 sS'randomNumber' p12 I105 sbt. ******************************************************************************************************************* As I understand the pickle-algorithm this file looks as intended except for the i_mp_bee88a136571a696398a0eb82b06eeb3 which normaly would be the name of the module. Obviously the module name is converted into some mod_python GUID thingy... The error message i get is the following: MOD_PYTHON ERROR ProcessId: 3784 Interpreter: 'xx' ServerName: 'xx' DocumentRoot: 'C:/Program Files/Apache Software Foundation/Apache2.2/htdocs' URI: '/python/test/pickletest.py' Location: None Directory: 'C:/Program Files/Apache Software Foundation/Apache2.2/htdocs/python/' Filename: 'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\pickletest.py' PathInfo: '' Phase: 'PythonHandler' Handler: 'mod_python.publisher' Traceback (most recent call last): File "C:\Program Files\Python25\lib\site-packages\mod_python\importer.py", line 1537, in HandlerDispatch default=default_handler, arg=req, silent=hlist.silent) File "C:\Program Files\Python25\lib\site-packages\mod_python\importer.py", line 1229, in _process_target result = _execute_target(config, req, object, arg) File "C:\Program Files\Python25\lib\site-packages\mod_python\importer.py", line 1128, in _execute_target result = object(arg) File "C:\Program Files\Python25\lib\site-packages\mod_python\publisher.py", line 213, in handler published = publish_object(req, object) File "C:\Program Files\Python25\lib\site-packages\mod_python\publisher.py", line 425, in publish_object return publish_object(req,util.apply_fs_data(object, req.form, req=req)) File "C:\Program Files\Python25\lib\site-packages\mod_python\util.py", line 554, in apply_fs_data return object(**args) File "C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\python\test\pickletest.py", line 25, in index (myInstance, myOtherInstance) = cPickle.load(file) ImportError: No module named _mp_bee88a136571a696398a0eb82b06eeb3 MODULE CACHE DETAILS Accessed: Tue Apr 01 11:05:33 2008 Generation: 26 _mp_bee88a136571a696398a0eb82b06eeb3 { FileName: 'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\dummyclass.py' Instance: 1 Generation: 13 Modified: Tue Apr 01 09:59:54 2008 Imported: Tue Apr 01 10:05:22 2008 } _mp_754c5030ce462c9ea7741cb6f66d6cc1 { FileName: 'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\pickletest.py' Instance: 13 Generation: 26 Modified: Tue Apr 01 10:56:58 2008 Imported: Tue Apr 01 10:57:10 2008 Children: 'C:\\Program Files\\Apache Software Foundation\\Apache2.2\\htdocs\\python\\test\\dummyclass.py' } Is there a way how to use cPickle AND mod_python together? I also tried to use the session mechanism instead of the pickle mechanism to store instance objects in a binary file but that doesn't seem to work either (if I do a req.session['myInstances'] = (myInstance, myOtherInstance) then the session doesn't seem to be saved properly and thus, everytime I hit on browser-reload a new session is generated...) Would be really great if someone could help me with this! Greetings Dominique
|