On Tue, 2020-06-23 at 15:51 -0700, David Mathog wrote:
> What I am after is some method of keeping exactly one copy of each
> package-version in the common area (ie, one might find foo-1.2,
> foo-1.7, and foo-2.3 there), while also presenting only the one
> version of each (let's say foo-1.7) to a particular installed program.
> On linux it might do that by making soft links to the common
> PYTHONPATH area from another directory for which it sets PYTHONPATH
> for the application. Finally, this has to be usable by any account
> which has read execute access to the main directory.
> 
> Does such a beast exist?  If so, please point me to it!

zc.buildout[1] and zc.recipe.egg[2] can do something very much like this. 
zc.buildout tries hard to maintain reproducibility and isolation, and one of 
the ways it does this is by keeping each package in its own .egg directory. It 
then generates the entry-point scripts and a REPL with ``sys.path`` explicitly 
set to reference exactly the versions specified. There's no virtualenv-like 
activation step that puts all those scripts on the path, though, so one must 
either do that manually or just invoke the generated scripts directly.

For example, here's a buildout configuration that specifies a shared directory 
to store eggs in. It also has some parts using zc.recipe.egg, one that will use 
zope.interface 4 and one that will use zope.interface 5 (egg specifications can 
be arbitrarily complex, of course, dependencies are followed, etc):

  [buildout]
  eggs-directory = /<path>/buildout-eggs
  abi-tag-eggs = true
  parts =
    old-interface
    new-interface
    new-interface-plus

  [old-interface]
  recipe = zc.recipe.egg
  eggs =
    zope.interface == 4.0
  interpreter = old-py

  [new-interface]
  recipe = zc.recipe.egg
  eggs =
    zope.interface == 5.1
  interpreter = new-py

  [new-interface-plus]
  recipe = zc.recipe.egg
  eggs =
    zope.interface == 5.1
    zope.component
  interpreter = new-py-plus


After running `buildout`, I have three REPL files (if zope.interface had 
defined any entry point scripts, I could also have had those generated):

  $ head bin/new-py
  #!<path/to/python>

  import sys

  sys.path[0:0] = [
      '/<path>/buildout-eggs/pypy_73/zope.interface-5.1.0-py2.7.egg',
      '/<path/to/python>/site-packages',
  ]

  $ head bin/old-py
  #!<path/to/python>

  import sys

  sys.path[0:0] = [
      '/<path>/buildout-eggs/pypy_73/zope.interface-4.0.0-py2.7.egg',
      '/<path/to/python>/site-packages',
  ]
  
  $ head bin/new-py-plus
  #!<path/to/python>

  import sys

  sys.path[0:0] = [
      '/<path>/buildout-eggs/pypy_73/zope.interface-5.1.0-py2.7.egg',
      '/<path>/buildout-eggs/pypy_73/zope.component-4.6.1-py2.7.egg',
      '/<path/to/python>/site-packages',
  ]


I've got a collection of zope.interface eggs referenced from a variety of 
different buildouts (at least at one point in time) and from a variety of 
different Python implementations, but only ever one copy of each:

  $ ls -ld buildout-eggs/*/zope.interface*
  Permissions Size User    Date Modified    Name
  drwxr-xr-x     - jmadden 2017-05-04 06:53 
buildout-eggs/pypy_41/zope.interface-4.4.0-py2.7.egg/
  drwxr-xr-x     - jmadden 2017-05-04 07:00 
buildout-eggs/cp27m/zope.interface-4.4.0-py2.7-macosx-10.12-x86_64.egg/
  drwxr-xr-x     - jmadden 2017-05-09 17:55 
buildout-eggs/cp34m/zope.interface-4.4.0-py3.4-macosx-10.12-x86_64.egg/
  drwxr-xr-x     - jmadden 2017-06-08 10:20 
buildout-eggs/cp27m/zope.interface-4.4.1-py2.7-macosx-10.12-x86_64.egg/
  drwxr-xr-x     - jmadden 2017-07-11 10:07 
buildout-eggs/cp36m/zope.interface-4.4.2-py3.6-macosx-10.12-x86_64.egg/
  drwxr-xr-x     - jmadden 2017-12-08 11:10 
buildout-eggs/cp27m/zope.interface-3.6.7-py2.7-macosx-10.13-x86_64.egg/
  drwxr-xr-x     - jmadden 2018-05-07 11:05 
buildout-eggs/cp27m/zope.interface-4.1.3-py2.7-macosx-10.13-x86_64.egg/
  drwxr-xr-x     - jmadden 2020-03-13 07:53 
buildout-eggs/cp27m/zope.interface-4.6.0-py2.7-macosx-10.15-x86_64.egg/
  drwxr-xr-x     - jmadden 2020-04-08 07:32 
buildout-eggs/cp38/zope.interface-5.1.0-py3.8-macosx-10.15-x86_64.egg/
  drwxr-xr-x     - jmadden 2020-05-17 09:30 
buildout-eggs/cp27m/zope.interface-5.1.0-py2.7.egg/
  drwxr-xr-x     - jmadden 2020-06-11 07:42 
buildout-eggs/pypy_73/zope.interface-5.1.0-py2.7.egg/
  drwxr-xr-x     - jmadden 2020-06-25 11:58 
buildout-eggs/pypy_73/zope.interface-4.0.0-py2.7.egg/


~Jason

[1] http://www.buildout.org/ ; I recommend version 3, which uses pip to find 
eggs
[2] https://pypi.org/project/zc.recipe.egg/
--
Distutils-SIG mailing list -- distutils-sig@python.org
To unsubscribe send an email to distutils-sig-le...@python.org
https://mail.python.org/mailman3/lists/distutils-sig.python.org/
Message archived at 
https://mail.python.org/archives/list/distutils-sig@python.org/message/G52C7F6QHH3TINSOYBMI5CV54SWCZMPT/

Reply via email to