Hello Zopistas I created an extension (a hit counter) that includes the class definition in the same source file as the method. After a couple of days ZopeHTTPServer crashed without any apparent reason. On restarting I got the following errors in the server.log file: Traceback (innermost last): File "serve.py", line 99, in ? ZopeHTTPServer.main(args) File "/home/pavlos/Zope-1.9.0b2-src/ZopeHTTPServer/ZopeHTTPServer.py", line 456, in main start(module_file,host,port,threading,env) File "/home/pavlos/Zope-1.9.0b2-src/ZopeHTTPServer/ZopeHTTPServer.py", line 405, in start set_published_module(module_file,BoboRequestHandler,env) File "/home/pavlos/Zope-1.9.0b2-src/ZopeHTTPServer/ZopeHTTPServer.py", line 401, in set_published_module __import__(name) # to catch problem modules right away File "/home/pavlos/Zope-1.9.0b2-src/lib/python/Main.py", line 103, in ? Bobobase=OFS.Application.open_bobobase() File "/home/pavlos/Zope-1.9.0b2-src/lib/python/OFS/Application.py", line 319, in open_bobobase app._setObject('Control_Panel', cpl) File "/home/pavlos/Zope-1.9.0b2-src/lib/python/BoboPOS/PickleJar.py", line 261, in setstate state = unpickler.load() SystemError: Failed to import class Counter from module __main__ As I understand the problem has to do with pickle not finding the class definition. I assume that the External methods object uses exec to load and store only the function definition into Zope/BoboPOS and not any other code that finds in the source file. I hacked Main.py and included a from Counter import Counter but it did not work. So now I am stuck without Zope :-( Also the change was made 2 days ago and all objects from there on include refrences to the counter object. Am I missing something simple or have I messed things up badly? Pavlos
Pavlos Christoforou wrote:
Hello Zopistas
I created an extension (a hit counter) that includes the class definition in the same source file as the method. After a couple of days ZopeHTTPServer crashed without any apparent reason. On restarting I got the following errors in the server.log file:
Traceback (innermost last): File "serve.py", line 99, in ? ZopeHTTPServer.main(args) File "/home/pavlos/Zope-1.9.0b2-src/ZopeHTTPServer/ZopeHTTPServer.py", line 456, in main start(module_file,host,port,threading,env) File "/home/pavlos/Zope-1.9.0b2-src/ZopeHTTPServer/ZopeHTTPServer.py", line 405, in start set_published_module(module_file,BoboRequestHandler,env) File "/home/pavlos/Zope-1.9.0b2-src/ZopeHTTPServer/ZopeHTTPServer.py", line 401, in set_published_module __import__(name) # to catch problem modules right away File "/home/pavlos/Zope-1.9.0b2-src/lib/python/Main.py", line 103, in ? Bobobase=OFS.Application.open_bobobase() File "/home/pavlos/Zope-1.9.0b2-src/lib/python/OFS/Application.py", line 319, in open_bobobase app._setObject('Control_Panel', cpl) File "/home/pavlos/Zope-1.9.0b2-src/lib/python/BoboPOS/PickleJar.py", line 261, in setstate state = unpickler.load() SystemError: Failed to import class Counter from module __main__
I need to figure out a way to handle this more gracefully.
As I understand the problem has to do with pickle not finding the class definition. I assume that the External methods object uses exec to load and store only the function definition into Zope/BoboPOS and not any other code that finds in the source file.
Yes.
I hacked Main.py and included a from Counter import Counter
You are close. Try: import __main__, Counter __main__.Counter=Counter.Counter
but it did not work. So now I am stuck without Zope :-( Also the change was made 2 days ago and all objects from there on include refrences to the counter object.
Am I missing something simple or have I messed things up badly?
It would be a good idea to avoid creating persistent objects in external methods. If an external method wants new classes that get pickled, it should: - Become a product, or - Use a class defined in a module in the package (or a subpackage of the package): Shared.your_org where your_org is your organization or name. Maybe I should add an option to cPickle to make it barf if an attempt is made to pickle an object in __main__. Jim -- Jim Fulton mailto:jim@digicool.com Technical Director (540) 371-6909 Python Powered! Digital Creations http://www.digicool.com http://www.python.org Under US Code Title 47, Sec.227(b)(1)(C), Sec.227(a)(2)(B) This email address may not be added to any commercial mail list with out my permission. Violation of my privacy with advertising or SPAM will result in a suit for a MINIMUM of $500 damages/incident, $1500 for repeats.
Jim Once again thanks On Thu, 17 Dec 1998, Jim Fulton wrote:
I need to figure out a way to handle this more gracefully.
It would be a good idea to avoid creating persistent objects in external methods. If an external method wants new classes that get pickled, it should:
- Become a product, or
- Use a class defined in a module in the package (or a subpackage of the package):
Shared.your_org
where your_org is your organization or name.
I think it would be nice if I can e-mail to someone my new cool Zopelet and have him install it without having to go through the above. Or even better we can install new Zopelets directly from a central repository on www.zope.org. Just an idle thought Pavlos
Pavlos Christoforou wrote:
Jim
Once again thanks
On Thu, 17 Dec 1998, Jim Fulton wrote:
I need to figure out a way to handle this more gracefully.
It would be a good idea to avoid creating persistent objects in external methods. If an external method wants new classes that get pickled, it should:
- Become a product, or
- Use a class defined in a module in the package (or a subpackage of the package):
Shared.your_org
where your_org is your organization or name.
I think it would be nice if I can e-mail to someone my new cool Zopelet and have him install it without having to go through the above. Or even better we can install new Zopelets directly from a central repository on www.zope.org.
You can, if you go the product rout. Just send them a tar ball with lib/python/Products/YourZopelet. Jim -- Jim Fulton mailto:jim@digicool.com Technical Director (540) 371-6909 Python Powered! Digital Creations http://www.digicool.com http://www.python.org Under US Code Title 47, Sec.227(b)(1)(C), Sec.227(a)(2)(B) This email address may not be added to any commercial mail list with out my permission. Violation of my privacy with advertising or SPAM will result in a suit for a MINIMUM of $500 damages/incident, $1500 for repeats.
participants (2)
-
Jim Fulton -
Pavlos Christoforou