[PEAK] setuptools dependencies installed from os packages

Phillip J. Eby pje at telecommunity.com
Mon Dec 19 13:11:05 EST 2005

At 07:11 PM 12/19/2005 +0200, alexander smishlajev wrote:
>it would be very nice if setuptools could find required modules installed 
>with os package management system (binary packages on windows, redhat and 
>debian, ports on *bsd, ebuilds on gentoo...)
>perhaps there could be a standard way for setuptools-aware package to 
>declare it's installed version?
>the long story: i am trying to run SQLObject tests.  SQLObject test system 
>verifies dependency requirements.  one of the requirements is 
>"FormEncode>=0.2.2".  i have FormEncode-0.4 installed from windows 
>installer.  but SQLObject tests fail with error 
>"pkg_resources.DistributionNotFound: FormEncode>=0.2.2".
>now i have two options: remove installed FormEncode and reinstall it from 
>egg, or hack SQLObject.egg-info and remove requirement for FormEncode.  i 
>don't like the first option because setuptools don't provide a way (other 
>than manual file removal) to uninstall obsolete packages, and i don't like 
>the second option because it smells very bad.
>... any thoughts?

The current version of setuptools in SVN allows you to make a bdist_wininst 
of an egg.

So, if you use these commands:

     easy_install -eb. FormEncode
     cd formencode
     setup.py bdist_wininst

you will have a FormEncode .exe that can uninstall itself, but which is 
nonetheless a valid egg.  The .exe will not use a .pth, and the files will 
be installed unzipped in a "traditional" package layout, but there will 
also be an .egg-info directory installed to site-packages that will tell 
other packages that it is installed.

If you need to do this with a package that does not use setuptools, you can 
do this:

     easy_install -eb. SomePackage
     cd somepackage
     python -c "import setuptools; execfile('setup.py')" bdist_wininst

which will force the use of setuptools to build a bdist_wininst egg.

The "bdist_rpm" command is also supported for this, and the third-party 
"bdist_nsi" (NSIS installer) and "bdist_msi" (Microsoft installer) commands 
should probably work also.

If you want to create packages for some other system, you can use "install 
--single-version-externally-managed" along with --root and/or --record to 
prebuild an installation for packaging.  If you are using something like 
bdist_deb that uses "setup.py install" you will need to modify the tool to 
include the --single-version-externally-managed option.  And if the package 
does not use setuptools, you will need the "python -c" hack shown above in 
order to force the setup script to use setuptools.

To sum up: you can build system packages for eggs now, and you can build 
system packages wrapping eggs even for packages that do not currently use 
setuptools.  But there is not a way to detect the presence and version of 
arbitrary system packages on arbitary platforms.

If you wish to flag the presence of such packages, however, you can now add 
.egg-info files to the directory on sys.path where they are installed.  The 
.egg-info file should be named with the project name and version (e.g. 
FormEncode-0.4.egg-info) and its contents should be the distutils PKG-INFO 
file found in the project's source distribution.  The above-described 
packaging techniques do this automatically, although they use an .egg-info 
directory instead.

To use any of these features, you must have the latest setuptools, i.e. one 
less than 48 hours old or so (these features were added late last 
week).  To upgrade, run:

     ez_setup.py setuptools==dev

or if you prefer to wrap setuptools itself in a bdist_wininst wrapper, do:

     ez_setup.py -eb. setuptools==dev
     cd setuptools
     setup.py bdist_wininst

and then install the resulting .exe.

More information about the PEAK mailing list