durusmail: quixote-users: dynamic path to import publisher factory
dynamic path to import publisher factory
2005-09-16
2005-09-16
dynamic path to import publisher factory
mario ruggier
2005-09-16
On Sep 16, 2005, at 3:25 PM, mario ruggier wrote:

> Hi,
>
> imagine several packages for the same application, installed
> simultaneously on the same machine. These can be for example a recent
> stable/demo version, and a bleeding edge dev version. I want to be
> able to run them concurrently, but independently. To run with either
> simple_server or scgi_server, I am executing the respective python
> scripts as new processes, that implies that if I adjust os.path in the
> calling process, I cannot pass that env info to the child process. Or
> can I?
>
> Looking at the code, I wonder whether it is (a) a good idea and (b)
> possible to be able to pass on to whichever server a parameter to add
> a specific dir to its os.path. I was imagining that either the factory
> param takes the form of
> - str : as it is currently...
> - (str, str) : a 2-tuple of str, where the frist str will be
> interpreted as a dir to add to os.path
>
> Then, the quixote.util.import_object(name) is similarly modified, e.g.
> to:
>
> quixote.util.import_object(name, add_to_path=None):
>       if add_to_path is not None:
>               if add_to_path not in os.path:
>                       sys.path.insert(0, add_to_path)
>       ...
>       rest of function as as currently

This does not work as advertised, because it is not possible to pass a
tuple as a shell script parameter ;-(

> Another way would be to add an "add_to_path" option to the various
> server scripts, that will then be handled separately (and before) from
> the import_object() call.

This does work. For example, all that is necessary is to wrap the call
to parse_args() (in the main() or equivalent of each server script e.g.
in quixote.server.scgi_server.main) with the following:

main():
     ....
     parser.add_option(
         '--prepend-import-path', dest="path", default=None,
         help="Prepend path to python's import path")
     (options, args) = parser.parse_args()
     if options.path is not None:
         import sys
         sys.path.insert(0, options.path)

Then, when run() is called, import_object(factory) works as expected.

> Does this sound reasonable, or is there a much simple way to do this?

I guess another way to do this is to launch by importing and calling
the respective server run(). But this has other non-desirable
side-effects, such as running under the (ps) name of the calling
utility script... and that I have things set-up to not run this way ;-(

mario

reply