Search code examples
pythondjangovirtualenvsetup.pypth

How to execute Python Code on Interpreter Startup in Virtualenv?


I want to execute code after the python interpreter has started.

We use virtualenv and up to now we had a file called sitecustomize.py which got executed during interpreter start up.

The sitecustomize.py was part of our project. We use the Django definition of this term: It is a small python module which only holds config and nearly no code: Django's Definition of "Project"

Unfortunately some linux distros (Ubuntu) provide a global sitecustomize, and our per virtualenv sitecustomize does not get loaded.

Question

How to run Python code on interpreter startup in a virtualenv?

This code should be executed even if the interactive interpreter gets started.

Goal vs Strategy

I don't care if this hook is called "sitecustomize" or different :-)


Solution

  • An addition to @guettli's answer: you can even make a .pth file a part of your package's distribution, so when it is installed it will make some code run on python startup, and when it is uninstalled, this code will no longer run.

    Example package:

    • startup.pth
    • setup.py

    Contents of startup.pth:

    import sys; print('Success!!')
    

    Contents of setup.py:

    from setuptools import setup
    
    setup(
        name='pth_startup_example',
        data_files=[
            ('.', ['startup.pth'])
        ]
    )
    

    After creating these files, run pip install . in the same directory with the files. That should install startup.pth in your root python directory, and you should see Success!! printed every time your interpreter runs. To undo that, run pip uninstall pth_startup_example.

    You can add this to an existing package, or make a package like this a dependency of a different package.