[Zope-dev] Re: ploneout - Or how using zc.buildout for a common
Zope2 project might look like
Ian Bicking
ianb at colorstudy.com
Sat Jan 27 19:41:12 EST 2007
Martin Aspeli wrote:
>
>>> I don't have a usecase for executing the scripts with any python
>>> interpeter other than the one which ran setuptools to generate them, and
>>> therefore don't care for the hard-wired path manipulation
>>
>> I would agree that having to mangle multiple scripts is annoying. On
>> the other hand, I find the activate/deactivate dance annoying. I
>> rather think that the scripts that buildout has created should not
>> require any special activation or introduction to a particular
>> environment.
>>
>> Perhaps a solution is to let buildout put things in standard places
>> (as I'm typing this, we now have all the ploneout .egg and .egg-link
>> files/directories in ${buildout}/lib/python) and then have an optional
>> workingenv at the root of the buildout that could be activated when
>> you want that, but let the buildout-managed scripts (e.g. zope
>> start/stop and test runner) not require this?
>>
>> I have a feeling there's more to this than agreeing on directory
>> layout though. But I hope it oughtn't be *that much more*.
>
> I did some experimentation with this. Basically, I did:
>
> - make egg-directory and develop-egg-directory in buildout.cfg be
> lib/python2.4 (which is what workingenv uses)
>
> - run the buildout again
>
> - create standard workingenv (python workingenv.py .) in the root
> buildout directory
>
> The results are fairly encouraging:
>
> - buildout-installed eggs don't work in the workingenv jail...
> - ...but they do if I manually add them to lib/python2.4/easy_install.pth
> - easy_installed packages (i.e. installed with workingenv's
> easy_install) are available to zope
>
> This was only a brief test, but seems to me that if buildout was
> managing the easy_install.pth file we wouldn't be a million miles off
> something where the source bin/activate dance was optional and would
> work as a generic solution, but would not be required for zope's startup
> and other buildout-managed scripts.
I would assume that buildout is specifically disabling easy_install's
updating of easy-install.pth -- buildout is still installing packages
with easy_install, but with some monkeypatches of the command.
workingenv also monkeypatches easy_install, but only to change script
creation (as noted in another email) and to keep it from rejecting
workingenv's site.py.
Anyway, if easy_install was allowed to do its thing then they'd be more
compatible.
> However, I'm not sure whether and how buildout should manage
> easy_install.pth in a non-hacky way. A hacky way would be to have a
> buildout recipie that, if included, would just patch that file up based
> on buildout['buildout']['eggs'] (i.e. the list of eggs listed in
> buildout.cfg under the main [buildout] section).
>
> I don't really understand the purpose of easy_install.pth and why it
> matters here, though, so suggestions welcome. :)
Eggs exist to pkg_resources (the runtime portion of setuptools) simply
by being available on a path. E.g., if you have lib/python/ on the
path, and lib/python/Foo-1.0.egg/ exists, then if you do
pkg_resources.require('Foo') that will add lib/python/Foo-1.0.egg/ to
the path, and you can import from it. When you can actually import from
the egg it is "active". You can also see its entry points at that time,
but not if it is just available.
If lib/python/Foo-1.0.egg/ is on the path to start with you can import
from it directly. The eggs listed in easy-install.pth are put on the
path, and hence are activated by default. You can still require a
different egg version (e.g., Foo==1.1), and I believe setuptools will
(if it can) switch the path to remove the default activated egg and put
on the new egg.
If you install a package with easy_install -m ("multiversion") then none
of the versions go on the path, and eggs will only be added when they
are specifically required. Any egg listed in "install_requires" in
setup.py will get added as soon as you require the original egg, and
when you run a script from an egg it'll activate that egg as well, so if
you are thorough with your requirements then none of the eggs need to be
activated.
One problem if you are using entry points is that if your egg isn't
activated and you are searching entry points by name (not by egg) then
your egg has to be activated to work (Buffet and paster create templates
are both searched by name, for example). I have expected this to cause
more problems than it has, but since people have stopped leaning too
heavily on setuptools versioning (thanks to virtual-python, workingenv,
and buildout) I think it hasn't come up much. Anyway, if Zope was to
start using entry points to replace some of its ZCML (which I personally
think would be a good idea) this is something to be aware of.
Ian
More information about the Zope-Dev
mailing list