Як користуватися пітоном virtualenv з sudo?


47

Я намагаюся зробити середовище python окремим від системного (використовуючи virtualenv) в каталозі, який не знаходиться в / вдома, тому що мені потрібно використовувати його для створення іншого програмного забезпечення, яке має бути доступним для декількох користувачів. Я можу створити і активувати virtualenv все в порядку, але коли я sudoякусь команду (наприклад, робити або компілювати інше програмне забезпечення), то використовується системний пітон (я можу сказати через доступні модулі).

Оскільки в Ubuntu користуватися кореневим користувачем не дуже добре , чи є спосіб сказати sudoвикористовувати virtualenv? А може, це не правильний підхід, і я повинен зробити абсолютно нову інсталяцію python?

Я використовую 64-бітну версію Ubuntu 12.04 (і python 2.7).


1
Чи працює наступне? sudo $ (який пітон) <script>
Джон Дрінан

Відповіді:


57

Проблема майже напевно полягає в тому, що при запуску sudoзмінні середовища, псевдоніми, функції тощо не переносяться.

Рішенням було б явно запускати виконуваний Python віртуальної середовища sudo. Наприклад, якщо вашим virtualenv є ./AwesomeProject, тоді ви можете запустити sudo ./AwesomeProject/bin/python <script>використовувати сценарій з virtualenv з root правами.


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

Фу, прикро, що поки що це єдине рішення. На Mac, sudo python використовує python з віртуальної env.
gaefan

4

Щойно наткнувшись на це, і для інших, хто може виявити ту саму проблему, Кен правильний, що змінні env не переносяться. Я використовував рішення, щоб додати наступні рядки до мого сценарію. Це має додаткову перевагу завжди завантажувати віртуальне середовище безпосередньо зі сценарію. (Це означає, що ви можете використовувати скрипт за допомогою crontab або запускати без будь-яких інших обхідних шляхів.)

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.