Как установить переменные среды в virtualenv - PullRequest
0 голосов
/ 21 сентября 2018

Если у меня есть скрипт на python, который активирует virtualenv следующим образом:

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

Как мне установить переменные для этого скрипта без изменения этого скрипта?

Я хочу, чтобы эта переменная среды былаактивен для всех сценариев, использующих этот virtualenv.

Это означает, что изменение этого сценария не является решением, поскольку существует двадцать сценариев, и я не хочу изменять двадцать сценариев.

Написание сценария оболочки-оболочки вокруг сценариев Python будет работать, но я бы хотел этого избежать.

Раньше я думал, что для кода запуска можно использовать пользовательский sitecustomize.py.Но Ubuntu (AFAIK единственный дистрибутив, который делает это) поставляется с собственным файлом sitecustomize.py, в результате чего мой sitecustomize.py не вызывается.См. https://bugs.launchpad.net/ubuntu/+source/python2.5/+bug/197219

Вот несколько способов, как я хочу использовать virtualenv:

(я снова подумал об этомЯ полагаю, что установка переменных не является работой Python или virtualenv. Мне нужен унифицированный способ установки переменных среды. И в моем случае я хотел бы сделать это без использования оболочки оболочки).

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Бит хакерский, но должен работать.

  1. Переименовать python ссылку в виртуальной среде bin во что-то вроде python.lnk
  2. В папке binсоздать файл python, который выглядит как

    #!/bin/sh
    
    export TEST='It works!'
    
    "$0.lnk" "$@"
  3. Сделать его исполняемым

    chmod +x python

Тогда, если вызапустите скрипт, например

#!/work/venv/bin/python
import os

print 'Virtualenv variable TEST="{}"'.format(os.environ['TEST'])

, следующим образом:

./myscript.py

и распечатайте:

Virtualenv variable TEST="It works!"

0 голосов
/ 28 сентября 2018

при написании sitecustomize.py файла и изменении bin/python все это выполнимые решения, я бы предложил другой метод, который не предусматривает непосредственное изменение содержимого внутри virutalenv, просто установив файл .pth:

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

с содержанием:

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

test:

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

хитрость в том, что python будет загружать каждый .pth файл при запуске , и если он естьстрока начинается с import, эта строка будет выполнена , что позволяет вводить произвольный код.

преимущество в том, что вы можете просто написать пакет python в установить это .pth файл с setuptools , установите в virtualenv, который вы хотите изменить.

0 голосов
/ 24 сентября 2018

Из того, что я пробовал, кажется, что если вы создадите файл sitecustomize.py в виртуальной среде, он будет иметь приоритет над глобальным sitecustomize.py, установленным в каталоге /usr/lib/python2.7.Вот что я сделал:

Создание sitecustomize.py в виртуальной среде

$ echo "import os; os.environ['FOO'] = 'BAR'" > ~/venvs/env_test/lib/python2.7/sitecustomize.py

Убедитесь, что он импортируется и выполняется при запуске двоичного файла Python из виртуальной среды

$ ~/venvs/env_test/bin/python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sitecustomize
>>> sitecustomize.__file__
'/home/abhinav/venvs/env_test/lib/python2.7/sitecustomize.py'
>>> import os
>>> os.environ['FOO']
'BAR'
>>>

Просто чтобы убедиться, что FOO установлен даже без явного импорта sitecustomize:

$ ~/venvs/env_test/bin/python
Python 2.7.15rc1 (default, Apr 15 2018, 21:51:34)
[GCC 7.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.environ['FOO']
'BAR'
>>>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...