Подтвердить что ты не робот

PYTHONPATH не работает для sudo на GNU/Linux (работает для root)

EDIT: работает для root, sudo - проблема. Читайте ниже.

У меня есть каталог с моими собственными библиотеками, например. мои библиотеки Python расположены в /home/name/lib/py.
Я добавил этот каталог в Python PATH для всех пользователей (включая root), добавив следующую строку в /etc/bash.bashrc:

export PYTHONPATH=$PYTHONPATH:/home/name/lib/py

Он работает для всех пользователей (включая root). Но это не работает для sudo. Есть ли способ, которым я могу использовать sudo /etc/bash.bashrc?

EDIT: Дополнительная информация:

Я добавил PYTHONPATH в файл sudoers следующим образом: Defaults env_keep += "HOME PYTHONPATH". Это sitll не работает.

env | grep PYTHON:
    PYTHONDONTWRITEBYTECODE=1
    PYTHONPATH=/home/name/lib/py

sudo env | grep PYTHON:
    PYTHONDONTWRITEBYTECODE=1

sudo echo $PYTHONPATH:
    /home/name/lib/py
4b9b3361

Ответ 1

Исправление в моем случае состояло в удалении Defaults !env_reset из sudoers.

Но мне пришлось держать Defaults env_keep += "PYTHONPATH" в судерах.
Я действительно добавил Defaults env_reset (который сбрасывает переменные среды), но он по-прежнему работает из-за env_keep.

Кажется, что env_keep и !env_reset конфликтуют с eachother, но это только предположение.


Итак, весь процесс:

  • добавить export PYTHONPATH=/your/custom/path в ~/.bashrc или /etc/bash.bashrc
  • добавить PYTHONPATH в Defaults env_keep += "ENV1 ENV2 ..." в файл sudoers
  • удалить Defaults !env_reset из файла sudoers, если присутствует

Ответ 2

То же самое верно для переменной PATH, она также не переносится в среду суперпользователя, даже если вы передаете флаг среды сохранения -E.

Теперь я использую эту команду sudo без каких-либо других модификаций:

sudo -HE env PATH=$PATH PYTHONPATH=$PYTHONPATH ./bin/myscript

Поскольку это альтернативный подход, который работает (для меня), я думал, что поделюсь здесь.

Ответ 3

Другой совет:

sudo echo $PYTHONPATH:
    /home/name/lib/py

Это не сработает. Shell интерпретирует это следующим образом:

1) развернуть $PYTHONPATH из переменной env, например:/usr/lib/python

2) выполните "sudo echo/usr/lib/python"

Ответ 4

Альтернативы манипулированию PYTHONPATH:

Ответ 5

Это, вероятно, должно быть опубликовано где-то в другом месте. Но sudo не будет обрабатывать файл окружения по умолчанию. Если вы хотите вызвать, что флаг -i должен помочь вам. Он будет имитировать начальный вход пользователей.

Возможно, вам придется поиграть с тем, где вы тоже ставите свои переменные. http://linux.die.net/man/8/sudo

Ответ 6

Следующие настройки помогают мне запускать несколько сервисов python в выделенных VENV на одном хосте Centos

  1. Экспорт переменных env в отдельный файл, например /etc/sysconfig/my-app
  2. Установить опцию EnvironmentFile в конфигурации сервиса

см. код ниже:

-bash-4.2$ sudo vi /etc/sysconfig/my-app

PATH=/usr/local/my-app/env/bin:$PATH
LD_LIBRARY_PATH=/usr/local/my-app/env/lib:$LD_LIBRARY_PATH



-bash-4.2$ sudo vi /etc/systemd/system/my-app.service

[Unit]
Description=my-app daemon
After=network.target


[Service]
EnvironmentFile=/etc/sysconfig/my_app
User=app_user
Group=app_user
Type=simple
ExecStart=/usr/local/my-app/env/bin/python /usr/local/my-app/main.py
Restart=on-failure
RestartSec=5s
PrivateTmp=true

[Install]
WantedBy=multi-user.target