[Baypiggies] Entry points help

malcolm malcolm at hoprocker.net
Wed Feb 13 02:18:10 CET 2013


Hey Glen

I've got no idea if this matters -- haven't used this before -- but
comparing your entry_point structure against then one the SO post, it looks
as though you've missed the type definitions by a bit. The poster on SO
structured his entry_points like so:

entry_points = {        # <-- dict
   'group_name' :  [            # <-- list
         'ep_func =  module:attr',
         ..

Whereas you've structured yours like so:

entry_points = {        # <-- dict
    'group_name': dict(           # <-- dict
            'name' = (tuple),
            ..

I also found the SO structure used here:
http://reinout.vanrees.org/weblog/2010/01/06/zest-releaser-entry-points.html

Like I said, I've never toyed with this corner of packaging, but maybe this
can shed some light.

-m

On Tue, Feb 12, 2013 at 5:00 PM, Glen Jarvis <glen at glenjarvis.com> wrote:

> I have a directory like this:
>
> baypiggies
>    - __init__.py
>    - fruit.py
>    - meat.py
>    - mock.py
>    - runner.py
>
> My runner.py is the main entry point and it is used to dynamically chose
> which of these other files to import.
>
> # pylint: disable=C0103,R0904
>
> """A sample dynamically loaded example with endpoints
>
> ./runner.py --backend=fruit
> """
>
> from optparse import OptionParser
>
>
> entry_points = {
>     'fruit': dict(
>         thump = ('fruit', 'thump'),
>         eat = ('fruit', 'eat'),
>         chew = ('fruit', 'chew'),
>     ),
>     'meat': dict(
>         thump = ('meat', 'thump'),
>         eat = ('meat', 'eat'),
>         chew = ('meat', 'chew'),
>     ),
>     'mock': dict(
>         thump = ('mock', 'thump'),
>         eat = ('mock', 'eat'),
>         chew = ('mock', 'chew'),
>     ),
>     'custom1': dict(
>         thump = ('myns.mypkg.mymodule', 'thump'),
>         eat = ('myns.mypkg.mymodule', 'eat'),
>         chew = ('myns.mypkg.mymodule', 'chew'),
>     ),
> }
>
> def import_entry_points(entries):
>
>     """Dynamically import the functions for the specified backend
>
>     entry_points is a global dictionary whos keys correspond to each
>     of the different types of backends that we can support. The variable
>     options.backend specifies which of the backends that will be used
>     during this program run.
>
>     The value of entry_points (for options.backend) is another
>     dictionary which map the functions needed to the modules from where
>     we will import these modules. We only want to import the backend
>     modules that will be used (and not have unnecessary dependencies).
>
>     This module will replace the values in this inner dictionary with
>     the imported functions. This way, the functions are imported and
>     available when needed.
>     """
>
>     for entry in entries:
>         module, name = entries[entry]
>         _temp = __import__(module, globals(), locals(), [name], 0)
>         entries[entry] = getattr(_temp, entry)
>
>
> def run(backend="mock"):
>     print "Running, backend: ", backend
>     import_entry_points(entry_points[backend])
>
>     import pprint
>     pprint.pprint(entry_points)
>
>     print "THUMPING..."
>     entry_points[backend]["thump"]()
>
>     print "EATING..."
>     entry_points[backend]["eat"]()
>
>     print "CHEWING..."
>     # Chew five times
>     entry_points[backend]["chew"](5)
>
> if __name__ == "__main__":
>     parser = OptionParser()
>     parser.add_option("-b", "--backend", dest="backend",
>                       default="mock",
>                       help="Choose which backend to run.")
>
>     (options, args) = parser.parse_args()
>     run(options.backend)
>
>
>
> Now, as you can see, the backends are loaded dynamically depending upon
> the command line options (let's only import what we need).
>
> prompt> python runner.py
> Running, backend:  mock
> {'custom1': {'chew': ('myns.mypkg.mymodule', 'chew'),
>              'eat': ('myns.mypkg.mymodule', 'eat'),
>              'thump': ('myns.mypkg.mymodule', 'thump')},
>  'fruit': {'chew': ('fruit', 'chew'),
>            'eat': ('fruit', 'eat'),
>            'thump': ('fruit', 'thump')},
>  'meat': {'chew': ('meat', 'chew'),
>           'eat': ('meat', 'eat'),
>           'thump': ('meat', 'thump')},
>  'mock': {'chew': <function chew at 0x10c3e1aa0>,
>           'eat': <function eat at 0x10c3e1a28>,
>           'thump': <function thump at 0x10c3e19b0>}}
> THUMPING...
> Pretend to thump
> EATING...
> Pretend to eat
> CHEWING...
> Prentend to chew
>
>
> And, totally new/different backend if I choose the option:
>
>
> Running, backend:  fruit
> {'custom1': {'chew': ('myns.mypkg.mymodule', 'chew'),
>              'eat': ('myns.mypkg.mymodule', 'eat'),
>              'thump': ('myns.mypkg.mymodule', 'thump')},
>  'fruit': {'chew': <function chew at 0x103a11aa0>,
>            'eat': <function eat at 0x103a11a28>,
>            'thump': <function thump at 0x103a119b0>},
>  'meat': {'chew': ('meat', 'chew'),
>           'eat': ('meat', 'eat'),
>           'thump': ('meat', 'thump')},
>  'mock': {'chew': ('mock', 'chew'),
>           'eat': ('mock', 'eat'),
>           'thump': ('mock', 'thump')}}
> THUMPING...
> Thumping fruit...
> EATING...
> Eating fruit.. very healthy....
> CHEWING...
> Fruit chew  0
> Fruit chew  1
> Fruit chew  2
> Fruit chew  3
> Fruit chew  4
>
>
>
> Here are examples of my backends:
>
>
>
>
> """An empty mock (Currently not implemented)"""
>
>
> def thump():
>
>     print "Pretend to thump"
>
>
> def eat():
>
>     print "Pretend to eat"
>
>
> def chew(number_of_times):
>
>     print "Prentend to chew"
>
>
>
>
> Here's the mock one (by default):
>
>
> def thump():
>
>     print "Pretend to thump"
>
>
> def eat():
>
>     print "Pretend to eat"
>
>
> def chew(number_of_times):
>
>     print "Prentend to chew"
>
>
>
>
>
> So, I'm supposed to be using entry points from the setuptools library
> (instead of the above). But, I've googled and get stuck. I just don't see
> how to use it (and use it without doing a setup each time).:
>
>
> http://stackoverflow.com/questions/774824/explain-python-entry-points/9615473#9615473
>
> Can someone help me by example? I'm confused...
>
>
> Cheers,
>
>
> Glen
> --
>
> "Pursue, keep up with, circle round and round your life as a dog does his
> master's chase. Do what you love. Know your own bone; gnaw at it, bury it,
> unearth it, and gnaw it still."
>
> --Henry David Thoreau
>
> _______________________________________________
> Baypiggies mailing list
> Baypiggies at python.org
> To change your subscription options or unsubscribe:
> http://mail.python.org/mailman/listinfo/baypiggies
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/baypiggies/attachments/20130212/f62958db/attachment-0001.html>


More information about the Baypiggies mailing list