sitecustomize.py not imported in a virtual environment

Bug #1971637 reported by Роман Донченко
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
python3.10 (Ubuntu)
New
Undecided
Unassigned

Bug Description

This is on Ubuntu 22.04, python3==3.10.4-3.

Run this:

$ python3.10 -mvenv ./venv
$ echo 'print("In sitecustomize.py")' > ./venv/lib/python3.10/site-packages/sitecustomize.py
$ ./venv/bin/python -c ''
[nothing]

Expected output:

In sitecustomize.py

The reason this doesn't work is that the python3 package contains its own sitecustomize module (at /usr/lib/python3.10/sitecustomize.py) whose job is to initialize the Apport exception hook, and /usr/lib/python3.10 is listed before ./venv/lib/python3.10/site-packages in the default sys.path.

I think the best way to fix this would be to:

1. Remove /usr/lib/python3.10/sitecustomize.py from libpython3.10-minimal

2. Add /usr/lib/python3/dist-packages/apport.pth with the following contents to python3-apport:

   import apport_python_hook; apport_python_hook.install()

This would have the same effect as the current sitecustomize.py, but would not conflict with user-provided sitecustomize modules.

Alternatively, /usr/lib/python3.10/sitecustomize.py could simply be moved to /usr/lib/python3.10/dist-packages, which would also fix the problem. A disadvantage of this approach is that a user-defined /usr/local/lib/python3.10/dist-packages/sitecustomize.py file would override it and disable the Apport hook.

Revision history for this message
Wynn Wilkes (wynnw) wrote :

This is still a major problem with Ubuntu 24.04 and python 3.12. I realize this choice has been in ubuntu for years after looking at other bug reports that were rejected. Sadly, this choice breaks projects that use the standard sitecustomize machinery to initialize their python environments and force them into really bad workarounds and hacks.

For anyone else stumbling into this, one workaround is to modify the /etc/python3.12/sitecustomize.py file to have a block like this appended to the file:

#############################################################################################
# support a virtualenv's sitecustomize file
import importlib.machinery, os, sys, types

initial_paths = sys.path[:]
for p in initial_paths:
    if p.startswith(sys.exec_prefix) and p.endswith("site-packages"):
        venv_sitecustomize = os.path.join(p, "sitecustomize.py")
        if os.path.exists(venv_sitecustomize):
            sfl = importlib.machinery.SourceFileLoader("sitecustomize", venv_sitecustomize)
            sfl.exec_module(types.ModuleType(sfl.name))
##############################################################################################

The suggestions in the descriptions are excellent and would allow the apport stuff to work and not impact serious python backend projects that never want to install or use the apport bug reporting features and need to be able to use sitecustomize in their virtual environments.

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.