[Distutils] installing .py plugins to an alternate directory

P.J. Eby pje at telecommunity.com
Thu Dec 3 19:58:46 CET 2009

At 01:06 AM 12/3/2009 +0100, Andrew Dalke wrote:
>Hi all,
>   I'm working with the Akara project. It contains a web server. The 
> server loads extensions from a special directory (let's say 
> "$AKARA" for now). An extension can register handlers for URLs. An 
> example extension might look like:
>installs to $AKARA/spam_extension.py
>(note: only .py files are supported; not even .pyc files)
>from akara.services import simple_service
>import my_spam # This is part of the distribution, and gets put in 
>@simple_service("GET", "http://vikings.protocol.id/")
>def vikings(say=my_spam.DEFAULT_TEXT):
>     return my_spam.vikings(say)
>We want people to be able to distribute Akara plugins and install 
>via setup.py. Ideally I would like to say:
>from distutils.core import setup
>from akara.distutils ... I'm not sure what here ...
>setup(name="Spam services",
>       package="my_spam",
>       akara_extensions=["spam_extension.py"]
>To clarify, the development/distribution package looks like:
>   $PACKAGE/setup.py
>   $PACKAGE/spam_extensions.py
>   $PACKAGE/my_spam/__init__.py
>   $PACKAGE/my_spam/dramatis_personae.py
>   $PACKAGE/my_spam/cafe.py
>and $PACKAGE/spam_extensions.py goes to $AKARA/spam_extensions.py 
>while $PACKAGE/my_spam is copied to site-packages.
>The installation does not need to byte-compile spam_extension.py.
>It should also include spam_extension.py in any distribution that it makes.
>I looked through the documentation and searched for existing 
>examples, but found nothing which does this. The plugins I found 
>used entry_points, and that's an architecture change which I don't 
>think is appropriate for us.

It wouldn't be so much of a change as an addition.  You'd just add 
code like this, either before or after your existing loop over the 
extensions directory:

      for entry_point in pkg_resources.iter_entry_points('akara'):
          extension_module = entry_point.load()
          # do stuff with extension_module

And then users would declare their extensions for installation like this:

setup(name="Spam services",
       entry_points={'akara':'Spam services=spam_extension'} # 
arbitrary name=module

Everything else would be the same as you described above with respect 
to layout, except:

1. the spam_extension module would be installed in site-packages
2. It wouldn't need to be a top-level module (i.e., it could be a 
module in the package)
3. You don't need any custom distutils extensions, except what you 
get via setuptools or Distribute.

More information about the Distutils-SIG mailing list