Search code examples
pythonvirtualenv

How to set environment variables in virtualenv


If I have python script which activates the virtualenv like this:

#!/path/to/venv/bin/python

How can I set variables for this script without modifying this script?

I want this environment variable to be active for all scripts which use this virtualenv.

This means modifying this script is not a solution, since there are twenty scripts, and I don't want to modify twenty scripts.

Writing a shell wrapper-script around the python scripts would work, but I would like to avoid this.

In the past I thought a custom sitecustomize.py can be used for start-up code. But Ubuntu (AFAIK the only distribution which does this) comes with its own sitecustomize.py file, with the effect that my sitecustomize.py does not get called. See https://bugs.launchpad.net/ubuntu/+source/python2.5/+bug/197219

Here are some ways how I want to use the virtualenv:

(I have thought about this again. I guess it setting the variables is not the job of python or virtualenv. I need a unified way to set environment variables. And in my case I would like to do this without using a shell wrapper).


Solution

  • while writing sitecustomize.py file and changing bin/python all are feasible solutions, I would suggest another method that does not involve directly change contents inside virutalenv, by simply install a .pth file:

    ./venv/lib/python2.7/site-packages/_set_envs.pth
    

    with content:

    import os; os.environ['FOO'] = 'bar'
    

    test:

    $ ./venv/bin/python -c "import os; print os.getenv('FOO')"
    bar
    

    the trick is, python will load every .pth file on startup, and if there is a line starts with import, this line will be get executed, allowing inject arbitrary code.

    the advantage is, you could simply write a python package to install this .pth file with setuptools, install to the virtualenv you want to change.