Graham Dumpleton
graham.dumpleton at gmail.com
Sun Aug 17 20:59:19 EDT 2008
2008/8/18 Poletto Guillaume <polettog at gmail.com>: > > Yes, I'm new to both Python programming language and mod_python If you are new to Python and want to write web applications, any reason why you didn't start out with one of the arguably more friendly higher level frameworks such as Django? > and i found the import_module() paragraph in the manual not really easy to eat. It is a complicated issue. :-) > What I understood is that, a such function is necessary to reload modified modules used by the webserver because the interpreter lives as long as the apache child process lives. It isn't absolutely necessary, it is a convenience more for when developing code as you don't need to restart Apache after every change. Do note though that the code modules this applies to is quite limited. For changes to modules/packages installed on sys.path you still need to restart the whole of Apache. > Okay, but what was not clear is : does mod_python overrides the Python's statement "import" to make the same things than import_module()? > If yes, why this function? It doesn't strictly override 'import' statement. Instead it hooks in Python APIs that underlay 'import'. http://www.python.org/dev/peps/pep-0302/ You thus have the ability to say that for certain imports they are treated in certain ways and taken from different storage mechanisms. > I made a test and i modified a module imported by "import" statement in my handler module : the changes where taken in count without restarting apache Two things could be happening here. The first is that the module being imported was in the same directory and was being managed by mod_python module importer and on detecting a change, it reloaded code appropriately. Alternatively, you have been deceived by the fact that Apache/mod_python on UNIX is a multiprocess web server and so a completely different processes which hadn't loaded it previously handled the request and so code got loaded for first time, and wasn't because of a reload at all. In this later case, it may not have even been a candidate for reloading and might just be a standard Python module/package. If you have: PythonDebug On set in configuration and monitor the Apache error log files you should be able to see when a code files is being handled by mod_python module importer and when it is being first loaded and/or reloaded. If it isn't in there, it is a standard module/package and reloading not possible. > Maybe the difference is in the treatment of packages.. The import_module() breaks all namespace stuff with packages (we could not do the same as "import package.subpackage.module" and then use stuff with "package.subpackage.module.function()" notation, although this doesn't seem to be recommanded in classic python softwares) The documentation says that it only applies to single Python code files and doesn't work for Python packages. If you are trying to get it to work for Python packages, at least to the extent of expecting reloading to work, you will be disappointed. > As I am new to Python, i was first thinking of designing my website like a classic python application, with packages and stuff, but tell me i should rather think of arranging my modules in classic directories and use import_module() each time. If you are new to Python and have dropped down to the level of mod_python module importer already, I would suggest you run away. Instead have a look at one of the high level web frameworks for Python as you will be able to get onto developing your application much quicker and will not have to be worried about such low level details. :-) Graham
|