[mod_python] python path and 3.3

Graham Dumpleton grahamd at dscpl.com.au
Fri Dec 1 23:22:22 EST 2006


On 02/12/2006, at 10:57 AM, Clodoaldo wrote:

>> Ok, I did it and now this works:
>>
>> import constants as C
>>
>> But this does not work:
>>
>> from mod_python import apache
>> C = apache.import_module('constants.py')
>>
>
> Changed it to:
>
> from mod_python import apache
> C = apache.import_module('~/mod/constants.py')
>
> And it works.

The apache.import_module() function is doing double duty in allowing
either a module name or a path for a file (including extension). For a
path it has to be able to be distinguishable from a module or module  
within
package name. Thus, for a path, can only use:

   /some/path/module.py
   ~/some/path/module.py
   ./some/path/module.py
   ../some/path/module.py

For anything else it assumes it is a normal module import. For  
'constants.py'
that thus means it thinks you are wanting to import a submodule  
called 'py'
from a package called 'constants'.

There are a few other quirks with the new importer. The first is that  
when a
path is specified, you don't actually need to use a .py extension.  
This means
for example that the mpservlets package which uses a .mps extension  
could
quite easily be rewritten to use the new module importer rather than  
its own
and get all the benefit of the full depth checks on module reloading.  
In other
words:

   module = apache.import_module("/some/path/servlet.mps")

will work.

This may be useful if you don't want to use a .py extension and want  
to use
something else to hide the fact that Python is being used.

Another strange characteristic of the new module importer, although this
also actually works in more recent Python versions if using __import__ 
(),
although not perhaps on all platforms, is that one can use a '/' to  
refer to a
module name in a subdirectory somewhere on the module search path.

What this means is that if you had used:

   PythonOption mod_python.importer.path "['~/']"

rather than:

   PythonOption mod_python.importer.path "['~/mod']"

you could then have said:

   apache.import_module('mod/constants')

Note that I haven't used a '.py' extension. In some way this is like  
having a
package, but the big difference is that the 'mod' directory doesn't  
have to be
an actual package, ie., no __init__.py file is required.

This method can thus be used to create a namespace for modules still,  
ie.,
by using a subdirectory, but since a package isn't being used, automatic
module reloading still works.

Since the same works with __import__() for some versions of Python,
falling back to using __import__() may be useful if you are trying to do
testing outside of mod_python.

Graham


More information about the Mod_python mailing list