[Python-Dev] PEP 376 proposed changes for basic plugins support
M.-A. Lemburg
mal at egenix.com
Mon Aug 2 22:37:39 CEST 2010
Michael Foord wrote:
> On 02/08/2010 20:36, M.-A. Lemburg wrote:
>> Michael Foord wrote:
>>
>>> On 02/08/2010 13:31, exarkun at twistedmatrix.com wrote:
>>>
>>>> On 12:21 pm, mal at egenix.com wrote:
>>>>
>>>>> Tarek Ziad� wrote:
>>>>>
>>>>>> On Mon, Aug 2, 2010 at 3:06 AM, P.J. Eby<pje at telecommunity.com>
>>>>>> wrote:
>>>>>> ..
>>>>>>
>>>>>>> So without specific examples of why this is a problem, it's hard to
>>>>>>> see why
>>>>>>> a special Python-specific set of configuration files is needed to
>>>>>>> resolve
>>>>>>> it, vs. say, encouraging application authors to use the available
>>>>>>> alternatives for doing plugin directories, config files, etc.
>>>>>>>
>>>>>> I don't have a specific example in mind, and I must admit that if an
>>>>>> application does the right thing
>>>>>> (provide the right configuration file), this activate feature is not
>>>>>> useful at all. So it seems to be a bad idea.
>>>>>>
>>>>>> I propose that we drop the PLUGINS file idea and we add a new
>>>>>> metadata
>>>>>> field called Provides-Plugin
>>>>>> in PEP 345, which will contain the info I've described minus the
>>>>>> state
>>>>>> field. This will allow us to expose
>>>>>> plugins at PyPI.
>>>>>>
>>>>>> IOW, have entry points like setuptools provides, but in a metadata
>>>>>> field instead of a entry_points.txt file.
>>>>>>
>>>>> Do we really need to make Python packaging even more complicated by
>>>>> adding support for application-specific plugin mechanisms ?
>>>>>
>>>>> Packages can already work as application plugins by simply defining
>>>>> a plugins namespace package and then placing the plugin packages
>>>>> into that namespace.
>>>>>
>>>>> See Zope for an example of how well this simply mechanism works out in
>>>>> practice: it simply scans the "Products" namespace for sub-packages
>>>>> and
>>>>> then loads each sub-package it finds to have it register itself with
>>>>> Zope.
>>>>>
>>>> This is also roughly how Twisted's plugin system works. One drawback,
>>>> though, is that it means potentially executing a large amount of
>>>> Python in order to load plugins. This can build up to a significant
>>>> performance issue as more and more plugins are installed.
>>>>
>>>>
>>> unittest will solve this problem by having plugins explicitly enabled in
>>> its own configuration system, and possibly managed through a separate
>>> tool like a plugins subcommand. The full package list will *only* need
>>> to be scanned when managing plugins, not during normal execution.
>>>
>>> Having this distutils2 supported "plugin declaration and discovery" will
>>> be extremely useful for the unittest plugin system. Given that plugins
>>> may need configuring after installation, and tools that handle both
>>> activation and configuration can be provided, it doesn't seem a heavy
>>> cost.
>>>
>>> The downside to this is that installing and activating plugins are two
>>> separate steps. Given that each project can have a different set of
>>> plugins enabled I don't see a way round it.
>>>
>> You might want to take a look at the Trac plugin system which
>> works in more or less the same way:
>>
>> http://trac.edgewall.org/wiki/TracPlugins
>>
>>
>>
>
> Ouch. I really don't want to emulate that system. For installing a
> plugin for a single project the recommended technique is:
>
> * Unpack the source. It should provide a setup.py.
> * Run:
>
> $ python setup.py bdist_egg
>
> Then you will have a *.egg file. Examine the output of running
> python to find where this was created.
>
> Once you have the plugin archive, you need to copy it into the
> plugins directory of the project environment
>
> For global plugins it just uses entry points, which is similar to the
> functionality we are suggesting adding... However note:
>
> Unlike plugins installed per-environment, you'll have to explicitly
> enable globally installed plugins via trac.ini.
>
> Really this sounds *astonishingly* like the system we are proposing. :-)
> (Global discovery with per-application choice about whether or not
> installed plugins are actually used).
The difference being that Trac is usually hosted using a
separate Python installation, so the pre-application choice is
really a per-Trac instance choice.
But yes, the system you are proposing does sound a lot like
what Trac uses and it works well - for that one application.
>> Since applications tend to have a rather diverse set of needs for
>> plugins, I don't think we should add plugins support to PEP 376.
>
> We are really just suggesting adding entry points.
Tarek's email sounded a lot like the attempt to come up
with a universal plugin system, both in terms of managing
installed plugins and their configuration.
Perhaps I've just missed some twist in the thread :-)
>> Users of applications will not want to edit a single configuration
>> file to maintain plugins of many different applications
>
> This we are not proposing. Nor were we ever proposing it. The single
> file that was proposed (and in my understanding is no longer proposed)
> was to be maintained by distutils2 *anyway*.
Sorry, I was refering to the plugins.cfg file used for
enabling the plugins, not the PLUGINS file used by
installers.
http://mail.python.org/pipermail/python-dev/2010-August/102627.html
>> (they might
>> break some other application doing so) and sys admins
>> will have trouble with such a setup as well (they usually want to
>> have control over which plugins get used for various reasons).
>>
>> In the end, you'd have a system wide plugin configuration (maintained
>> by the sys admin), a per user one (with local customizations) and a
>> per application one (providing application-specific defaults) -
>> which only increases complexity and doesn't really solve anything.
>
> We simply provide information about the availability of plugins. System
> administrators or users can control the use of this information (and the
> plugins) as per their own policies.
>
>> Instead, I'd suggest to let each application do its own little thing
>> to manage plugins, in a complex or simple way, with or without
>> configuration, and have them all live happily side-by-side.
>>
>> The stdlib should really only provide tools to applications and
>> make useful suggestions, not try to enforce application design
>> choices. I think that's simply out of scope for the stdlib
>>
>>
> Well, a tool for application developers is pretty much all that is being
> proposed.
Right, but one which has consequences for users of applications
relying on the feature.
setuptools was also "just" a tool for application developers,
but one which had some serious side-effects for users.
Let's please not play the same trick again and be more careful
about the user side of things, e.g. plugin configuration should
not be part of a Python packaging system.
Plugin discovery is useful, but doesn't really require yet another
lookup file. The few bits of extra information could easily be
placed into the distribution meta-data of PEP 345.
Perhaps the main motivation behind adding a new PLUGINS file is to
reduce the overhead of having to scan dozens of meta-data .dist-info
directories ?!
If that's the case, then it would be better to come up with an
idea of how to make access to that meta-data available in a less
I/O intense way, e.g. by having pip or other package managers update
a central SQLite database cache of the data found on disk.
--
Marc-Andre Lemburg
eGenix.com
Professional Python Services directly from the Source (#1, Aug 02 2010)
>>> Python/Zope Consulting and Support ... http://www.egenix.com/
>>> mxODBC.Zope.Database.Adapter ... http://zope.egenix.com/
>>> mxODBC, mxDateTime, mxTextTools ... http://python.egenix.com/
________________________________________________________________________
::: Try our new mxODBC.Connect Python Database Interface for free ! ::::
eGenix.com Software, Skills and Services GmbH Pastor-Loeh-Str.48
D-40764 Langenfeld, Germany. CEO Dipl.-Math. Marc-Andre Lemburg
Registered at Amtsgericht Duesseldorf: HRB 46611
http://www.egenix.com/company/contact/
More information about the Python-Dev
mailing list