apport exception hook negatively impacts startup of python

Bug #105764 reported by Glyph Lefkowitz
6
Affects Status Importance Assigned to Milestone
apport (Ubuntu)
Fix Released
Medium
Martin Pitt
python2.4 (Ubuntu)
Fix Released
Medium
Matthias Klose
python2.5 (Ubuntu)
Fix Released
Medium
Matthias Klose

Bug Description

Binary package hint: python2.5

I was investigating why a task which spawned many very simple Python scripts was taking a substantially time running on my Feisty installation than on my Dapper installation, and I ran across the installation of the "apport" hook. The functionality there is very cool, and I appreciate it, but I removed it and saw these modules imported with python -v:

$ python -v
# installing zipimport hook
import zipimport # builtin
# installed zipimport hook
# /usr/lib/python2.5/site.pyc has bad mtime
import site # from /usr/lib/python2.5/site.py
# can't create /usr/lib/python2.5/site.pyc
# /usr/lib/python2.5/os.pyc matches /usr/lib/python2.5/os.py
import os # precompiled from /usr/lib/python2.5/os.pyc
import posix # builtin
# /usr/lib/python2.5/posixpath.pyc matches /usr/lib/python2.5/posixpath.py
import posixpath # precompiled from /usr/lib/python2.5/posixpath.pyc
# /usr/lib/python2.5/stat.pyc matches /usr/lib/python2.5/stat.py
import stat # precompiled from /usr/lib/python2.5/stat.pyc
# /usr/lib/python2.5/UserDict.pyc matches /usr/lib/python2.5/UserDict.py
import UserDict # precompiled from /usr/lib/python2.5/UserDict.pyc
# /usr/lib/python2.5/copy_reg.pyc matches /usr/lib/python2.5/copy_reg.py
import copy_reg # precompiled from /usr/lib/python2.5/copy_reg.pyc
# /usr/lib/python2.5/types.pyc matches /usr/lib/python2.5/types.py
import types # precompiled from /usr/lib/python2.5/types.pyc
import _types # builtin
# /usr/lib/python2.5/warnings.pyc matches /usr/lib/python2.5/warnings.py
import warnings # precompiled from /usr/lib/python2.5/warnings.pyc
# /usr/lib/python2.5/linecache.pyc matches /usr/lib/python2.5/linecache.py
import linecache # precompiled from /usr/lib/python2.5/linecache.pyc
import encodings # directory /usr/lib/python2.5/encodings
# /usr/lib/python2.5/encodings/__init__.pyc matches /usr/lib/python2.5/encodings/__init__.py
import encodings # precompiled from /usr/lib/python2.5/encodings/__init__.pyc
# /usr/lib/python2.5/codecs.pyc matches /usr/lib/python2.5/codecs.py
import codecs # precompiled from /usr/lib/python2.5/codecs.pyc
import _codecs # builtin
# /usr/lib/python2.5/encodings/aliases.pyc matches /usr/lib/python2.5/encodings/aliases.py
import encodings.aliases # precompiled from /usr/lib/python2.5/encodings/aliases.pyc
# /usr/lib/python2.5/encodings/utf_8.pyc matches /usr/lib/python2.5/encodings/utf_8.py
import encodings.utf_8 # precompiled from /usr/lib/python2.5/encodings/utf_8.pyc
Python 2.5.1c1 (release25-maint, Apr 6 2007, 22:02:36)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
dlopen("/usr/lib/python2.5/lib-dynload/readline.so", 2);
import readline # dynamically loaded from /usr/lib/python2.5/lib-dynload/readline.so

Then, I typed this line:

>>> import apport

and saw the following modules imported:

import apport # directory /var/lib/python-support/python2.5/apport
# /var/lib/python-support/python2.5/apport/__init__.pyc matches /var/lib/python-support/python2.5/apport/__init__.py
import apport # precompiled from /var/lib/python-support/python2.5/apport/__init__.pyc
# /var/lib/python-support/python2.5/apport/report.pyc matches /var/lib/python-support/python2.5/apport/report.py
import apport.report # precompiled from /var/lib/python-support/python2.5/apport/report.pyc
# /usr/lib/python2.5/subprocess.pyc matches /usr/lib/python2.5/subprocess.py
import subprocess # precompiled from /usr/lib/python2.5/subprocess.pyc
# /usr/lib/python2.5/traceback.pyc matches /usr/lib/python2.5/traceback.py
import traceback # precompiled from /usr/lib/python2.5/traceback.pyc
dlopen("/usr/lib/python2.5/lib-dynload/select.so", 2);
import select # dynamically loaded from /usr/lib/python2.5/lib-dynload/select.so
import errno # builtin
dlopen("/usr/lib/python2.5/lib-dynload/fcntl.so", 2);
import fcntl # dynamically loaded from /usr/lib/python2.5/lib-dynload/fcntl.so
# /usr/lib/python2.5/pickle.pyc matches /usr/lib/python2.5/pickle.py
import pickle # precompiled from /usr/lib/python2.5/pickle.pyc
import marshal # builtin
# /usr/lib/python2.5/struct.pyc matches /usr/lib/python2.5/struct.py
import struct # precompiled from /usr/lib/python2.5/struct.pyc
dlopen("/usr/lib/python2.5/lib-dynload/_struct.so", 2);
import _struct # dynamically loaded from /usr/lib/python2.5/lib-dynload/_struct.so
# /usr/lib/python2.5/re.pyc matches /usr/lib/python2.5/re.py
import re # precompiled from /usr/lib/python2.5/re.pyc
# /usr/lib/python2.5/sre_compile.pyc matches /usr/lib/python2.5/sre_compile.py
import sre_compile # precompiled from /usr/lib/python2.5/sre_compile.pyc
import _sre # builtin
# /usr/lib/python2.5/sre_constants.pyc matches /usr/lib/python2.5/sre_constants.py
import sre_constants # precompiled from /usr/lib/python2.5/sre_constants.pyc
# /usr/lib/python2.5/sre_parse.pyc matches /usr/lib/python2.5/sre_parse.py
import sre_parse # precompiled from /usr/lib/python2.5/sre_parse.pyc
dlopen("/usr/lib/python2.5/lib-dynload/binascii.so", 2);
import binascii # dynamically loaded from /usr/lib/python2.5/lib-dynload/binascii.so
dlopen("/usr/lib/python2.5/lib-dynload/cStringIO.so", 2);
import cStringIO # dynamically loaded from /usr/lib/python2.5/lib-dynload/cStringIO.so
# /usr/lib/python2.5/tempfile.pyc matches /usr/lib/python2.5/tempfile.py
import tempfile # precompiled from /usr/lib/python2.5/tempfile.pyc
# /usr/lib/python2.5/random.pyc matches /usr/lib/python2.5/random.py
import random # precompiled from /usr/lib/python2.5/random.pyc
dlopen("/usr/lib/python2.5/lib-dynload/math.so", 2);
import math # dynamically loaded from /usr/lib/python2.5/lib-dynload/math.so
dlopen("/usr/lib/python2.5/lib-dynload/_random.so", 2);
import _random # dynamically loaded from /usr/lib/python2.5/lib-dynload/_random.so
import thread # builtin
# /usr/lib/python2.5/urllib.pyc matches /usr/lib/python2.5/urllib.py
import urllib # precompiled from /usr/lib/python2.5/urllib.pyc
# /usr/lib/python2.5/string.pyc matches /usr/lib/python2.5/string.py
import string # precompiled from /usr/lib/python2.5/string.pyc
dlopen("/usr/lib/python2.5/lib-dynload/strop.so", 2);
import strop # dynamically loaded from /usr/lib/python2.5/lib-dynload/strop.so
# /usr/lib/python2.5/socket.pyc matches /usr/lib/python2.5/socket.py
import socket # precompiled from /usr/lib/python2.5/socket.pyc
dlopen("/usr/lib/python2.5/lib-dynload/_socket.so", 2);
import _socket # dynamically loaded from /usr/lib/python2.5/lib-dynload/_socket.so
dlopen("/usr/lib/python2.5/lib-dynload/_ssl.so", 2);
import _ssl # dynamically loaded from /usr/lib/python2.5/lib-dynload/_ssl.so
dlopen("/usr/lib/python2.5/lib-dynload/time.so", 2);
import time # dynamically loaded from /usr/lib/python2.5/lib-dynload/time.so
# /usr/lib/python2.5/urlparse.pyc matches /usr/lib/python2.5/urlparse.py
import urlparse # precompiled from /usr/lib/python2.5/urlparse.pyc
import pwd # builtin
dlopen("/usr/lib/python2.5/lib-dynload/grp.so", 2);
import grp # dynamically loaded from /usr/lib/python2.5/lib-dynload/grp.so
import ctypes # directory /usr/lib/python2.5/ctypes
# /usr/lib/python2.5/ctypes/__init__.pyc matches /usr/lib/python2.5/ctypes/__init__.py
import ctypes # precompiled from /usr/lib/python2.5/ctypes/__init__.pyc
dlopen("/usr/lib/python2.5/lib-dynload/_ctypes.so", 2);
import _ctypes # dynamically loaded from /usr/lib/python2.5/lib-dynload/_ctypes.so
# /usr/lib/python2.5/ctypes/_endian.pyc matches /usr/lib/python2.5/ctypes/_endian.py
import ctypes._endian # precompiled from /usr/lib/python2.5/ctypes/_endian.pyc
# /usr/lib/python2.5/ctypes/util.pyc matches /usr/lib/python2.5/ctypes/util.py
import ctypes.util # precompiled from /usr/lib/python2.5/ctypes/util.pyc
# /usr/lib/python2.5/fnmatch.pyc matches /usr/lib/python2.5/fnmatch.py
import fnmatch # precompiled from /usr/lib/python2.5/fnmatch.pyc
import xml # directory /usr/lib/python2.5/xml
# /usr/lib/python2.5/xml/__init__.pyc matches /usr/lib/python2.5/xml/__init__.py
import xml # precompiled from /usr/lib/python2.5/xml/__init__.pyc
import _xmlplus # directory /usr/lib/python2.5/site-packages/_xmlplus
# /usr/lib/python2.5/site-packages/_xmlplus/__init__.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/__init__.py
import _xmlplus # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/__init__.pyc
import xml.dom # directory /usr/lib/python2.5/site-packages/_xmlplus/dom
# /usr/lib/python2.5/site-packages/_xmlplus/dom/__init__.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/__init__.py
import xml.dom # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/__init__.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/DOMImplementation.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/DOMImplementation.py
import xml.dom.DOMImplementation # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/DOMImplementation.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/Range.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/Range.py
import xml.dom.Range # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/Range.pyc
import xml.dom.html # directory /usr/lib/python2.5/site-packages/_xmlplus/dom/html
# /usr/lib/python2.5/site-packages/_xmlplus/dom/html/__init__.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/html/__init__.py
import xml.dom.html # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/html/__init__.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/html/HTMLDOMImplementation.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/html/HTMLDOMImplementation.py
import xml.dom.html.HTMLDOMImplementation # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/html/HTMLDOMImplementation.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/MessageSource.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/MessageSource.py
import xml.dom.MessageSource # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/MessageSource.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/FtCore.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/FtCore.py
import xml.FtCore # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/FtCore.pyc
# /usr/lib/python2.5/gettext.pyc matches /usr/lib/python2.5/gettext.py
import gettext # precompiled from /usr/lib/python2.5/gettext.pyc
# /usr/lib/python2.5/locale.pyc matches /usr/lib/python2.5/locale.py
import locale # precompiled from /usr/lib/python2.5/locale.pyc
dlopen("/usr/lib/python2.5/lib-dynload/_locale.so", 2);
import _locale # dynamically loaded from /usr/lib/python2.5/lib-dynload/_locale.so
dlopen("/usr/lib/python2.5/lib-dynload/operator.so", 2);
import operator # dynamically loaded from /usr/lib/python2.5/lib-dynload/operator.so
# /usr/lib/python2.5/copy.pyc matches /usr/lib/python2.5/copy.py
import copy # precompiled from /usr/lib/python2.5/copy.pyc
# /usr/lib/python2.5/encodings/latin_1.pyc matches /usr/lib/python2.5/encodings/latin_1.py
import encodings.latin_1 # precompiled from /usr/lib/python2.5/encodings/latin_1.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/domreg.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/domreg.py
import xml.dom.domreg # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/domreg.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/minicompat.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/minicompat.py
import xml.dom.minicompat # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/minicompat.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/minidom.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/minidom.py
import xml.dom.minidom # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/minidom.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/xmlbuilder.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/xmlbuilder.py
import xml.dom.xmlbuilder # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/xmlbuilder.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/dom/NodeFilter.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/dom/NodeFilter.py
import xml.dom.NodeFilter # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/dom/NodeFilter.pyc
import xml.parsers # directory /usr/lib/python2.5/site-packages/_xmlplus/parsers
# /usr/lib/python2.5/site-packages/_xmlplus/parsers/__init__.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/parsers/__init__.py
import xml.parsers # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/parsers/__init__.pyc
# /usr/lib/python2.5/site-packages/_xmlplus/parsers/expat.pyc matches /usr/lib/python2.5/site-packages/_xmlplus/parsers/expat.py
import xml.parsers.expat # precompiled from /usr/lib/python2.5/site-packages/_xmlplus/parsers/expat.pyc
dlopen("/usr/lib/python2.5/site-packages/_xmlplus/parsers/pyexpat.so", 2);
import xml.parsers.pyexpat # dynamically loaded from /usr/lib/python2.5/site-packages/_xmlplus/parsers/pyexpat.so
# /var/lib/python-support/python2.5/problem_report.pyc matches /var/lib/python-support/python2.5/problem_report.py
import problem_report # precompiled from /var/lib/python-support/python2.5/problem_report.pyc
dlopen("/usr/lib/python2.5/lib-dynload/bz2.so", 2);
import bz2 # dynamically loaded from /usr/lib/python2.5/lib-dynload/bz2.so
dlopen("/usr/lib/python2.5/lib-dynload/zlib.so", 2);
import zlib # dynamically loaded from /usr/lib/python2.5/lib-dynload/zlib.so
# /usr/lib/python2.5/base64.pyc matches /usr/lib/python2.5/base64.py
import base64 # precompiled from /usr/lib/python2.5/base64.pyc
# /usr/lib/python2.5/gzip.pyc matches /usr/lib/python2.5/gzip.py
import gzip # precompiled from /usr/lib/python2.5/gzip.pyc
import email # directory /usr/lib/python2.5/email
# /usr/lib/python2.5/email/__init__.pyc matches /usr/lib/python2.5/email/__init__.py
import email # precompiled from /usr/lib/python2.5/email/__init__.pyc
import email.mime # directory /usr/lib/python2.5/email/mime
# /usr/lib/python2.5/email/mime/__init__.pyc matches /usr/lib/python2.5/email/mime/__init__.py
import email.mime # precompiled from /usr/lib/python2.5/email/mime/__init__.pyc
# /usr/lib/python2.5/email/mime/multipart.pyc matches /usr/lib/python2.5/email/mime/multipart.py
import email.mime.multipart # precompiled from /usr/lib/python2.5/email/mime/multipart.pyc
# /usr/lib/python2.5/email/mime/base.pyc matches /usr/lib/python2.5/email/mime/base.py
import email.mime.base # precompiled from /usr/lib/python2.5/email/mime/base.pyc
# /usr/lib/python2.5/email/message.pyc matches /usr/lib/python2.5/email/message.py
import email.message # precompiled from /usr/lib/python2.5/email/message.pyc
# /usr/lib/python2.5/uu.pyc matches /usr/lib/python2.5/uu.py
import uu # precompiled from /usr/lib/python2.5/uu.pyc
# /usr/lib/python2.5/email/charset.pyc matches /usr/lib/python2.5/email/charset.py
import email.charset # precompiled from /usr/lib/python2.5/email/charset.pyc
# /usr/lib/python2.5/email/base64mime.pyc matches /usr/lib/python2.5/email/base64mime.py
import email.base64mime # precompiled from /usr/lib/python2.5/email/base64mime.pyc
# /usr/lib/python2.5/email/utils.pyc matches /usr/lib/python2.5/email/utils.py
import email.utils # precompiled from /usr/lib/python2.5/email/utils.pyc
# /usr/lib/python2.5/email/_parseaddr.pyc matches /usr/lib/python2.5/email/_parseaddr.py
import email._parseaddr # precompiled from /usr/lib/python2.5/email/_parseaddr.pyc
# /usr/lib/python2.5/quopri.pyc matches /usr/lib/python2.5/quopri.py
import quopri # precompiled from /usr/lib/python2.5/quopri.pyc
# /usr/lib/python2.5/email/encoders.pyc matches /usr/lib/python2.5/email/encoders.py
import email.encoders # precompiled from /usr/lib/python2.5/email/encoders.pyc
# /usr/lib/python2.5/email/quoprimime.pyc matches /usr/lib/python2.5/email/quoprimime.py
import email.quoprimime # precompiled from /usr/lib/python2.5/email/quoprimime.pyc
# /usr/lib/python2.5/email/errors.pyc matches /usr/lib/python2.5/email/errors.py
import email.errors # precompiled from /usr/lib/python2.5/email/errors.pyc
# /usr/lib/python2.5/email/iterators.pyc matches /usr/lib/python2.5/email/iterators.py
import email.iterators # precompiled from /usr/lib/python2.5/email/iterators.pyc
# /usr/lib/python2.5/email/mime/text.pyc matches /usr/lib/python2.5/email/mime/text.py
import email.mime.text # precompiled from /usr/lib/python2.5/email/mime/text.pyc
# /usr/lib/python2.5/email/mime/nonmultipart.pyc matches /usr/lib/python2.5/email/mime/nonmultipart.py
import email.mime.nonmultipart # precompiled from /usr/lib/python2.5/email/mime/nonmultipart.pyc
# /usr/lib/python2.5/unittest.pyc matches /usr/lib/python2.5/unittest.py
import unittest # precompiled from /usr/lib/python2.5/unittest.pyc
# /var/lib/python-support/python2.5/apport/fileutils.pyc matches /var/lib/python-support/python2.5/apport/fileutils.py
import apport.fileutils # precompiled from /var/lib/python-support/python2.5/apport/fileutils.pyc
# /usr/lib/python2.5/glob.pyc matches /usr/lib/python2.5/glob.py
import glob # precompiled from /usr/lib/python2.5/glob.pyc
# /var/lib/python-support/python2.5/apport/packaging_impl.pyc matches /var/lib/python-support/python2.5/apport/packaging_impl.py
import apport.packaging_impl # precompiled from /var/lib/python-support/python2.5/apport/packaging_impl.pyc
# /usr/lib/python2.5/shutil.pyc matches /usr/lib/python2.5/shutil.py
import shutil # precompiled from /usr/lib/python2.5/shutil.pyc
>>>

This is a substantial and unnecessary overhead for a hook which will be invoked only if the process exits with an error. While quite a few Python programs import a huge number of modules, some are tuned to be as conservative as possible about importing for performance reasons; that should be respected by the system installation.

The functionality need not be lost, since sys.excepthook should instead be set to a one-line function which, if apport were not yet imported, imported it.

Revision history for this message
Robert Collins (lifeless) wrote :

I agree, I did not realise how slow some of the dependant modules were when I wrote it. Perhaps you could supply a patch to either apport or python's site.py to perform just-in-time importing of the expensive modules?

Changed in apport:
importance: Undecided → Medium
status: Unconfirmed → Confirmed
Matthias Klose (doko)
Changed in python2.4:
status: Unconfirmed → Confirmed
Changed in python2.5:
status: Unconfirmed → Confirmed
Revision history for this message
Matthias Klose (doko) wrote :

please check the attached patches; IMO that should go to feisty final; it doesn't interact with normal operation

Revision history for this message
Matthias Klose (doko) wrote :
Changed in python2.4:
importance: Undecided → Medium
Changed in python2.5:
importance: Undecided → Medium
Revision history for this message
Robert Collins (lifeless) wrote : Re: [Bug 105764] Re: apport exception hook negatively impacts startup of python

On Thu, 2007-04-12 at 07:15 +0000, Matthias Klose wrote:
> please check the attached patches; IMO that should go to feisty final;
> it doesn't interact with normal operation

Ah, I see - apport.__init__ was the problem. The solution looks good to
me.

-Rob
--
GPG key available at: <http://www.robertcollins.net/keys.txt>.

Revision history for this message
Martin Pitt (pitti) wrote :

I fixed up a few remaining 'apport' prefix changes in the hook, gave it a better name, tested everything and committed:
  http://codebrowse.launchpad.net/~ubuntu-core-dev/apport/ubuntu/revision/martin.pitt%40ubuntu.com-20070412093504-06tyq5ntm7atqzil?start_revid=martin.pitt%40ubuntu.com-20070412095150-ujnli0m8e1uv2vid

The necessary /etc/python2.5/site.py diff now looks like this:

--- site.py.orig 2007-04-12 11:18:21.000000000 +0200
+++ site.py 2007-04-12 11:18:24.000000000 +0200
@@ -418,11 +418,11 @@
         del sys.setdefaultencoding
     # install the apport exception handler if available
     try:
- from apport import python_hook
+ import apport_python_hook
     except ImportError:
         pass
     else:
- python_hook.install()
+ apport_python_hook.install()

 main()

Changed in apport:
assignee: nobody → pitti
status: Confirmed → Fix Committed
Revision history for this message
Martin Pitt (pitti) wrote :

 apport (0.76) feisty; urgency=low
 .
   * Move python_hook.py out of the apport module to apport_python_hook.py, so
     that it does not inflict the expensive import of all apport related
     modules to every python program. Adapt module prefixes accordingly.
     (LP: #105764)
   * setup.py, debian/python-apport.install: Install apport_python_hook.py into
     the python-apport binary package.
   * apport/ui.py test suite: Unset locale related environment variables so
     that the tests which check strings are not invalidated by translations.

Changed in apport:
status: Fix Committed → Fix Released
Revision history for this message
Matthias Klose (doko) wrote :

fixed in python2.4_2.4.4-2ubuntu7

Changed in python2.4:
assignee: nobody → doko
status: Confirmed → Fix Released
Revision history for this message
Matthias Klose (doko) wrote :

fixed in python2.5_2.5.1~rc1-0ubuntu3

Changed in python2.5:
assignee: nobody → doko
status: Confirmed → Fix Released
To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.