Как использовать python virtualenv с sudo?


47

Я пытаюсь сделать среду Python отдельной от системной (используя virtualenv) в каталоге, который не находится в каталоге / home, потому что мне нужно использовать его для создания другого программного обеспечения, которое должно быть доступно для нескольких пользователей. Я могу создавать и активировать virtualenv, но когда я выполняю sudoкакую-либо команду (например, чтобы создать или скомпилировать другое программное обеспечение), используется системный питон (я могу сказать из-за доступных модулей).

Поскольку в Ubuntu использование root- пользователя не очень хорошо , есть ли способ сказать, sudoчто использовать virtualenv? Или, может быть, это не правильный подход, и я должен сделать совершенно новую установку Python?

Я использую 64-битную версию Ubuntu 12.04 (и python 2.7).


1
Работает ли следующее? sudo $ (какой питон) <script>
Джон Дринэйн

Ответы:


58

Проблема почти наверняка заключается в том, что при запуске sudoпеременные среды, псевдонимы, функции и т. Д. Среды virtualenv не переносятся.

Решение состоит в том, чтобы явно запустить исполняемый файл Python виртуальной среды с sudo. Например, если ваш virtualenv - это ./AwesomeProject, вы можете запустить sudo ./AwesomeProject/bin/python <script>сценарий с virtualenv с правами root.


3
Вы также можете позволить первой строке вашего скрипта указывать на двоичный файл Python в вашем virtualenv. #!<virtualenv_dir>/bin/python,
OrangeTux

Тьфу, раздражает, что это пока единственное решение. На Mac sudo python использует python из виртуальной среды.
Гэйфан

4

Просто наткнулся на это и для других, которые могут найти ту же проблему, Кен прав, что переменные env не переносятся. Решением, которое я использовал, было добавить следующие строки в мой скрипт. Это дает дополнительное преимущество - всегда загружать виртуальную среду непосредственно из сценария. (Это означает, что вы можете использовать скрипт с crontab или launchd без каких-либо других обходных путей.)

base_dir = os.path.dirname(os.path.abspath(__file__))
activate_this = os.path.join(base_dir, 'venv/bin/activate_this.py')
execfile(activate_this, dict(__file__=activate_this))

Дополнительная информация здесь: https://virtualenv.pypa.io/en/latest/userguide.html#using-virtualenv-without-bin-python


4

Иногда вам нужно обновить $ PATH, потому что скрипт запускает другие программы. Например, pypi-install требует py2dsc-deb в PATH. Эта команда работает:sudo sh -c ". venv/bin/activate ; pypi-install $PACKAGE"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.