Hi all --
at long last, I have fixed two problems that a couple people noticed a
* I folded in Amos Latteier's NT patches almost verbatim -- just
changed an `os.path.sep == "/"' to `os.name == "posix"' and added
some comments bitching about the inadequacy of the current library
installation model (I think this is Python's fault, but for now
Distutils is slavishly aping the situation in Python 1.5.x)
* I fixed the problem whereby running "setup.py install" without
doing anything else caused a crash (because 'build' hadn't yet
been run). Now, the 'install' command automatically runs 'build'
before doing anything; to make this bearable, I added a 'have_run'
dictionary to the Distribution class to keep track of which commands
have been run. So now not only are command classes singletons,
but their 'run' method can only be invoked once -- both restrictions
enforced by Distribution.
The code is checked into CVS, or you can download a snapshot at
Hope someone (Amos?) can try the new version under NT. Any takers for
BTW, all parties involved in the Great "Where Do We Install Stuff?"
Debate should take a good, hard look at the 'set_final_options()' method
of the Install class in distutils/install.py; this is where all the
policy decisions about where to install files are made. Currently it
apes the Python 1.5 situation as closely as I could figure it out.
Obviously, this is subject to change -- I just don't know to *what* it
Greg Ward - software developer gward(a)cnri.reston.va.us
Corporation for National Research Initiatives
1895 Preston White Drive voice: +1-703-620-8990
Reston, Virginia, USA 20191-5434 fax: +1-703-620-0913
I've been aware that the distutils sig has been simmerring away, but
until recently it has not been directly relevant to what I do.
I like the look of the proposed api, but have one question. Will this
support an installed system that has multiple versions of the same
package installed simultaneously? If not, then this would seem to be a
significant limitation, especially when dependencies between packages
Assuming it does, then how will this be achieved? I am presently
managing this with a messy arrangement of symlinks. A package is
installed with its version number in it's name, and a separate
directory is created for an application with links from the
unversioned package name to the versioned one. Then I just set the
pythonpath to this directory.
A sample of what the directory looks like is shown below.
I'm sure there is a better solution that this, and I'm not sure that
this would work under windows anyway (does windows have symlinks?).
So, has this SIG considered such versioning issues yet?
Tim Docker timd(a)macquarie.com.au
Quantative Applications Division
qad16:qad $ ls -l lib/python/
drwxr-xr-x 2 mts mts 512 Nov 11 11:23 1.1
-r--r----- 1 root mts 45172 Sep 1 1998 cdrmodule_0_7_1.so
drwxr-xr-x 2 mts mts 512 Sep 1 1998 chart_1_1
drwxr-xr-x 3 mts mts 512 Sep 1 1998 Fnorb_0_7_1
dr-xr-x--- 3 mts mts 512 Nov 11 11:21 Fnorb_0_8
drwxr-xr-x 3 mts mts 1536 Mar 3 12:45 mts_1_1
dr-xr-x--- 7 mts mts 512 Nov 11 11:22 OpenGL_1_5_1
dr-xr-x--- 2 mts mts 1024 Nov 11 11:23 PIL_0_3
drwxr-xr-x 3 mts mts 512 Sep 1 1998 Pmw_0_7
dr-xr-x--- 2 mts mts 512 Nov 11 11:21 v3d_1_1
qad16:qad $ ls -l lib/python/1.1
lrwxrwxrwx 1 root other 29 Apr 10 10:43 _glumodule.so -> ../OpenGL_1_5_1/_glumodule.so
lrwxrwxrwx 1 root other 30 Apr 10 10:43 _glutmodule.so -> ../OpenGL_1_5_1/_glutmodule.so
lrwxrwxrwx 1 root other 22 Apr 10 10:43 _imaging.so -> ../PIL_0_3/_imaging.so
lrwxrwxrwx 1 root other 36 Apr 10 10:43 _opengl_nummodule.so -> ../OpenGL_1_5_1/_opengl_nummodule.so
lrwxrwxrwx 1 root other 27 Apr 10 10:43 _tkinter.so -> ../OpenGL_1_5_1/_tkinter.so
lrwxrwxrwx 1 mts mts 21 Apr 10 10:43 cdrmodule.so -> ../cdrmodule_0_7_1.so
lrwxrwxrwx 1 mts mts 12 Apr 10 10:43 chart -> ../chart_1_1
lrwxrwxrwx 1 root other 12 Apr 10 10:43 Fnorb -> ../Fnorb_0_8
lrwxrwxrwx 1 mts mts 12 Apr 10 10:43 mts -> ../mts_1_1
lrwxrwxrwx 1 root other 15 Apr 10 10:43 OpenGL -> ../OpenGL_1_5_1
lrwxrwxrwx 1 root other 33 Apr 10 10:43 opengltrmodule.so -> ../OpenGL_1_5_1/opengltrmodule.so
lrwxrwxrwx 1 root other 33 Apr 10 10:43 openglutil_num.so -> ../OpenGL_1_5_1/openglutil_num.so
lrwxrwxrwx 1 root other 10 Apr 10 10:43 PIL -> ../PIL_0_3
lrwxrwxrwx 1 mts mts 10 Apr 10 10:43 Pmw -> ../Pmw_0_7
lrwxrwxrwx 1 root other 10 Apr 10 10:43 v3d -> ../v3d_1_1
On Wed, April 9, 2008 10:05 pm, Greg Ewing <greg.ewing(a)canterbury.ac.nz>
> Message: 4
> Date: Thu, 10 Apr 2008 12:59:39 +1200
> From: Greg Ewing <greg.ewing(a)canterbury.ac.nz>
> Subject: Re: [Distutils] how to easily consume just the parts of eggs
> that are good for you
> To: distutils-sig(a)python.org
> Paul Moore wrote:
>> I believe that Mac OS X goes for an even simpler structure -
>> applications store *everything* in the one directory, so that
>> install/uninstall is simply a directory copy/remove.
> Yep, and thereby cuts the whole gordian knot, throws the
> pieces on the fire and burns them. :-)
> Package managers have always seemed to me to be an
> excessively complex solution to a problem that needn't
> have existed in the first place.
> I keep hoping that someday Linux will support something
> like MacOSX application bundles and frameworks, but I
> haven't seen any sign of it yet.
I think this discussion arises because the operating systems we are
dealing with are based on very different concepts.
Windows and Mac are fundamentally single user systems that have added
capabilities for multiple users and are intended to be used with
proprietary software. Those considerations lead to minimal dependencies
among packages (each proprietary provider needs to control its own
package, except for the OS), individual users serving as their own
sysadmins, and similar factors. Any dependencies in the proprietary
software are hidden from the user because the provider has compiled the
dependencies into the binary code they supply.
Unix/Linux are fundamentally multi-user systems with a distinct role for a
sysadmin. Linux and the BSD's are intended to be used with Free/Open
Source Software (FOSS), and Unix originated the Software Tools concept in
which individual, relatively simple, separately-developed tools are
combined to perform complex tasks. Both FOSS and the Software Tools
concept encourage dependencies.
The need for package managers arises out of the Unix FHS. If you look at
the FHS, it is clearly designed to simplify the job of the sysadmin in a
multi-user system that uses FOSS and Software Tools. For example,
deciding what to backup and how often to do it in a Unix/Linux system is
relatively easy for the sysadmin. All the installed software is in
certain top-level directories. All the config files are in /etc. All the
logs. caches, spools, web pages, process locks, and certain other data are
in /var. All the user data is in /home or its sysadmin-determined
equivalents. If the sysadmin needs space, deleting files in /tmp will not
cause a problem.
In summary, Python is being used on systems that have very different
underlying OS use cases. To some extent, the natural use case for Python
is closest to that of Linux/Unix. Running Python on Windows/Mac requires
adapting for those platforms some of the kinds of tools that simplify
operations on Linux/Unix systems. This discussion is essentially about
how far that goes, how to accomplish it, and how to remain compatible with
the existing tools on Linux/Unix.
In the lxml project (http://codespeak.net/lxml), we've just noticed the
following problem with lxml eggs: you can easy_install an egg that won't
work for your Python.
This is because Python can be compiled with either 2 or 4 bytes unicode
as its internal representation. Any egg that contains compiled C code
that uses unicode such as lxml will run into trouble: if it's compiled
with a 4 bytes unicode Python, it won't work on a 2 bytes unicode
Python, and vice versa.
This problem is fairly common in Linux. Many distributions such as
Ubuntu and Fedora compile their python with 4 bytes unicode internal
representation. If you compile a Python interpreter by hand it defaults
to 2 bytes unicode, however. Hand-building a Python interpreter is done
fairly commonly by Linux sysadmins for various reasons.
It would therefore be very nice if it became possible to make eggs for
the different unicode compilation options of Python. This configuration
dimension is a real world issue for any binary Python module that does
anything with unicode text..
In an earlier mail to this list:
M.-A. Lemburg and Phillip Eby had the following discussion:
>>Please make sure that your eggs catch all possible
>>Python binary build dimensions:
>>* Python version
>>* Python Unicode variant (UCS2, UCS4)
>>* OS name
>>* OS version
>>* Platform architecture (e.g. 32-bit vs. 64-bit)
>As far as I know, all of this except the Unicode variant is captured in
>distutils' get_platform(). And if it's not, it should be, since it
>affects any other kind of bdist mechanism.
I'm not sure whether this means this needs to be escalated from
setuptools to the Python interpreter level itself. With this mail, I've
done the job escalating this lxml problem to what appears to be the
right place, though. :)
I have created a setup.py file for distirbution and I bumped into
a small bug when i tried to set my name in the contact field (Tarek Ziadé)
Using string (utf8 file):
line 162, in send_metadata
line 257, in post_to_server
value = unicode(value).encode("utf-8")
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 10:
ordinal not in range(128)
line 1094, in write_pkg_file
file.write('Author: %s\n' % self.get_contact() )
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position
18: ordinal not in range(128)
I would propose a patch for this problem but i don't know what would be the
best input (i guess unicode
Tarek Ziadé | Association AfPy | www.afpy.org
Blog FR | http://programmation-python.org
Blog EN | http://tarekziade.wordpress.com/
There are two things that cause a lot of people to object to the use
of setuptools: that it changes the semantics of PYTHONPATH, making it
impossible to override packages on the command-line, and that it
doesn't work when you run "setup.py install --prefix=./some_dir".
This patch addresses the first one. Currently, if you ever allow
setuptools to write into your system directory
(e.g. /usr/lib/python2.5/site-packages) then it will install a .pth
file which changes the behavior of PYTHONPATH.
This will prevent you from over-riding the installed package with a
specific package on the command-line, such as:
PYTHONPATH=./that-version-of-Twisted/ python ./my_script.py
Many people find this behavior of setuptools objectionable [1, 2, 3,
plus personal correspondance when I did my "Why do you hate
setuptools?" survey]. Fortunately it seems possible to preserve the
precedence of PYTHONPATH modules while still having installed eggs
override installed non-eggs, as motivated in .
Sat Nov 15 11:59:32 MST 2008 zooko(a)zooko.com
* leave the PYTHONPATH dirs at the front of the sys.path
This is in accordance with
http://www.python.org/doc/2.5.2/inst/search-path.html , which says
"The PYTHONPATH variable can be set to a list of paths that will be
added to the beginning of sys.path.", and it resolves an objection
many people have which impels them to ban setuptools from systems
@@ -1364,7 +1364,7 @@
"import sys; new=sys.path[sys.__plen:];"
" del sys.path[sys.__plen:];"
- " p=getattr(sys,'__egginsert',0); sys.path[p:p]=new;"
+ " p=getattr(sys,'__egginsert',len(os.environ.get
" sys.__egginsert = p+len(new)\n"
) % data
http://allmydata.org -- Tahoe, the Least-Authority Filesystem
http://allmydata.com -- back up all your files for $10/month
At 01:33 PM 2/24/2009 +0100, Tarek Ziadé wrote:
> > So, the uninstallation code should simply not remove file(s) that
> are referenced by more than one manifest in the target directory --
> a relatively simple, future-proof safeguard, that doesn't require
> any specific knowledge of "namespace packages" per se.
>Sounds good. Although, it requires scanning the files again which is
>not optimal, but the last point of this mail might be an idea to
Uninstallation isn't exactly a performance-critical activity. It's
trivial to read targetdir/*/RECORD and build up a dictionary of
file->package and package->file links; this is Python, after all. ;-)
>2009/2/24 Joachim König <him(a)online.de>:
> > An other option could be to put the egg-info dir into the package
> itself, e.g.
> > zlib/
> > __init__.py
> > egg-info/
> > PKG-INFO
> > MANIFEST
> > RECORD
> > ...
>This would require setuptools and pip to change the way they look for
More precisely, it would require pkg_resources to become ridiculously
slow, by massively increasing the number of directories that need to
be read at runtime to determine what packages are present.
>Indeed. Having an index file would make things a whole lot simpler.
For *whom*? Certainly not for system packaging tools (rpm, deb, et al).
A design goal should be to allow system packaging tools to install a
static file footprint: i.e., independent files with predefined
content, and no post-processing steps. You can't do that with a
shared file, which is why setuptools uses a .pth hack to install
namespace packages when building packages for rpm et al.
>I am wondering then if this is not an evolution of the .pth files.
>Although I find that having as many .pth file as we want is not robust.
>It make things slow down when you have too many of them.
>So, I'd be in favor of a new, unique, optimized, index file,
>with a set of functions located in pkgutil to read and write in it
>This index file could also index the namespace information,
>in order to speed up the work needed to uninstall a package that
>shares a namespace.
So, .pth files are bad... let's make more? In fact, let's make a
new thing that'll have its own, new bugs? So that we can have
uninstalls that take only 1/10th of a second instead of 1/2 a second?
The standard to beat in this area, I believe, is PEP 262. At the
very least, if you're making any major changes in direction from that
PEP, the rationale for those differences should be documented. (And
consolidated index files are explicitly rejected by that PEP, with
the current Distutils trunk in Python is now in theory compatible with
Python 2.3, as I fixed all the broken tests.
My goal is to make a standalone release anyone can use, by replacing
their Python's distutils with the newest
one. This is important to speed up distutils improvements.
There's one more task I need to address in order to make a standalone
release of Distutils that will
be usable under Python 2.3->2.6 : fix the problem described in this thread:
otherwise all packages based on setuptools will be broken.
I don't have a solution for that problem yet, and I am not sure if
this should be adressed in setuptools,
or in distutils, or on both sides.
Although, I have seen some other problems along the way, and the test
coverage is not sufficient
to see everything.
Any help on this will be appreciated to fix all the problem and
improve the test coverage.
If someone wants to give a hand, it's quite simple.
1/ install the standalone Distutils version located here:
$ svn co http://svn.python.org/projects/distutils/trunk/ distutils
$ cd distutils
$ python setup.py install
2/ remove the original distutils package located in Python lib
3/ run an installation (or anything) of a setuptools-based package
4/ report all the bugs here :)
Tarek Ziadé | Association AfPy | www.afpy.org
Blog FR | http://programmation-python.org
Blog EN | http://tarekziade.wordpress.com/