[Distutils] Get install prefix for module at runtime

Wolodja Wentland wentland at cl.uni-heidelberg.de
Sun Oct 4 13:04:56 CEST 2009


On Thu, Sep 17, 2009 at 21:05 +0200, Wolodja Wentland wrote:
> On Thu, Sep 17, 2009 at 18:51 +0200, Tarek Ziadé wrote:
> > you might be able to alter it on-the-fly by overriding  the build_py command
> > instead of the install command
> 
> That worked perfectly! Thanks again for the help and pointers you gave
> me. I really appreciate that.
> 
> The solution i came up with is:
> 
> --- snip ---
> class build_py(_build_py):
>     """build_py command
>     
>     This specific build_py command will modify module 'foo.build_config' so that it
>     contains information on installation prefixes afterwards.
>     """
>     def build_module (self, module, module_file, package):
>         if type(package) is StringType:
>             _package = string.split(package, '.')
>         elif type(package) not in (ListType, TupleType):
>             raise TypeError, \
>                   "'package' must be a string (dot-separated), list, or tuple"
> 
>         if ( module == 'build_info' and len(_package) == 1 and
>             package[0] == 'foo'):
>             iobj = self.distribution.command_obj['install']
> 
>             with open(module_file, 'w') as module_fp:
>                 module_fp.write('# -*- coding: UTF-8 -*-\n\n')
>                 module_fp.write("DATA_DIR = '%s'\n"%(
>                     os.path.join(iobj.install_data, 'share')))
>                 module_fp.write("LIB_DIR = '%s'\n"%(iobj.install_lib))
>                 module_fp.write("SCRIPT_DIR = '%s'\n"%(iobj.install_scripts))
> 
>         _build_py.build_module(self, module, module_file, package)
> --- snip ---
> 
> I might change the 'detect my module' logic a little because i rely on
> python short circuit evaluation a bit too much.
> 
> I have some final questions:
> 
> 1. Is the distutils API i am using here likely to change?
> 
> 2. Is there a better way to access install_{lib,scripts,data} than going
>    through the install command object available from distribution?
> 
> 3. Could you include something like this in distutils? My idea on how to
>    handle this would be to define an additional argument 'foo_bar' for
>    core.setup() which will take a user defined dotted module name in
>    which information like this will be saved.
> 
>    So if a user defines:
> 
>     core.setup( ...
>                 foo_bar : 'foo.build_info',
>                 ...
>                 )
> 
>     A file lib_prefix/foo/build_info.py will be injected into the
>     library or an already one would be altered according to user defined
>     string templates. 
> 
>     Something like this would end module.__file__ hacks once and for all
>     and is IMHO a much cleaner way to advertise this information to
>     libraries/application than trying to take care of this externally.

Bump.

Is this approach a feasible one, or am I better served by using the
Distribute API, which I am not familiar at this point?

What about the distutils internal I am using here?

TIA

    Wolodja
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 835 bytes
Desc: Digital signature
URL: <http://mail.python.org/pipermail/distutils-sig/attachments/20091004/b611842c/attachment.pgp>


More information about the Distutils-SIG mailing list