PYTHONPATH не работает для sudo в GNU / Linux (работает для root) - PullRequest
15 голосов
/ 01 ноября 2011

РЕДАКТИРОВАТЬ: Работает для root, проблема с sudo. Читайте ниже.

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

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

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

РЕДАКТИРОВАТЬ: Больше информации:

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

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

sudo env | grep PYTHON:
    PYTHONDONTWRITEBYTECODE=1

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

Ответы [ 6 ]

12 голосов
/ 02 ноября 2011

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

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

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


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

  1. добавить export PYTHONPATH=/your/custom/path в ~/.bashrc или /etc/bash.bashrc
  2. добавить PYTHONPATH в Defaults env_keep += "ENV1 ENV2 ..." в файле sudoers
  3. удалить Defaults !env_reset из файла sudoers, если имеется
11 голосов
/ 29 января 2016

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

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

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

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

2 голосов
/ 22 ноября 2012

Еще один совет:

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

Это не сработает. Оболочка будет интерпретировать это так:

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

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

1 голос
/ 02 ноября 2011

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

0 голосов
/ 17 апреля 2019

Следуя конфигурации, я могу запустить несколько служб 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
0 голосов
/ 01 ноября 2011

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

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

...