extension modules and multiple interpreters
nkauer at my-deja.com
nkauer at my-deja.com
Mon Nov 1 22:11:42 EST 1999
I run the following test script on Apache-1.3.6/PyApache-4.19
on Linux 2.2.5 (RedHat 6.0) with only one httpd child and the
module mxDateTime compiled into Python/PyApache, so there is
no dynamic loading of a shared library.
------------------------------------------------------------
print "Content-type: text/plain"
print
print
import sys, traceback
# just checking ...
if not sys.modules.has_key('mxDateTime'):
print 'No module mxDateTime in sys.modules'
print
import mxDateTime
print "sys.modules['mxDateTime'] = ", sys.modules['mxDateTime']
print "mxDateTime.__dict__['now'] = ", mxDateTime.__dict__['now']
print
print "calling mxDateTime.now() gives:",
try:
print mxDateTime.now()
except:
print
traceback.print_exc(file=sys.stdout)
--------------------------------------------------------------
First time http://localhost/mytest.py gives
*******************************
No module mxDateTime in sys.modules
sys.modules['mxDateTime'] = <module 'mxDateTime' (built-in)>
mxDateTime.__dict__['now'] = <built-in function now>
calling mxDateTime.now() gives: 1999-10-28 18:28:49.75
*******************************
And again http://localhost/mytest.py now gives
*******************************
No module mxDateTime in sys.modules
sys.modules['mxDateTime'] = <module 'mxDateTime' (built-in)>
mxDateTime.__dict__['now'] = <built-in function now>
calling mxDateTime.now() gives:
Traceback (innermost last):
File "/local/web/alpha/docroot/mytest.py", line 16, in ?
print mxDateTime.now()
TypeError: call of non-function (type None)
*******************************
After that experience, I eliminated all dependencies on module
DateTime/mxDateTime in my Python code, but now I get
the same error whenever something in module MySQLdb is
accessed for the second time ...
The mxDateTime author Marc Lemburg <mal at lemburg.com> writes:
"[...] indicates that PyApache (or perhaps the Python finalizer)
has cleared the module's namespace... which is bad, since
extension modules can typically only initialize themselves *once*."
Marc writes further:
"[T]his is really odd: the 'now' symbol still refers to the
existing function while the module seems to return None as
attribute."
The PyApache coordinator Lele Gaifax <lele at seldati.it> writes:
"I can confirm that the problem lives in the cleanup mechanism.
Python clears up its dictionaries, and doesn't allow a
reinit, as Marc pointed out. This is not a PyApache fault: you
can get the very same result running the pysrv demo [...].
In fact, every use of such modules mixed to multiple interpreters
should cause the problem."
Apparently, the fact that a module works with regular Python
does not guarantee that it also works with PyApache (or pysrv).
Lele Gaifax writes:
"[...]I cannot see a way out, if not digging in Python's internals.
[D]oes someone know if the problem has been raised before in the
Python community?"
Please, could someone with Python internals expertise explain this
issue? How can I tell in advance if an extension module will work
with PyApache? Is it possible to trick Python into cleanly
re-initializing a module? Is there any hope that I can run my
existing Web site with the Python interpreter embedded into
Apache's httpd?
Nikolas
Sent via Deja.com http://www.deja.com/
Before you buy.
More information about the Python-list
mailing list