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.
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?