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
Ответы
Ответ 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
- Экспорт переменных env в отдельный файл, например
/etc/sysconfig/my-app
- Установить опцию
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