Я пытаюсь запустить экземпляр Python Pipenv от имени пользователя root. Когда не запускается с правами root:
(myenv) $ python script.py
питон Pipenv используется правильно. Однако при запуске с правами root с sudo
:
(myenv) $ sudo python script.py
вместо этого используется системный питон по умолчанию в /usr/bin/python
. После некоторых поисков я нашел опцию -E
для sudo. Однако, с
(myenv) $ sudo -E python script.py
он все еще использует /usr/bin/python
, хотя sudo -E echo $PATH
дает то же самое, что и echo $PATH
, поэтому опция -E
работает нормально; однако sudo -E which python
продолжает давать /usr/bin/python
! Это не проблема прав доступа или доступа, потому что полный путь к питону Pipenv работает нормально. Почему используется неправильный двоичный файл, хотя $PATH
установлен правильно?
Хорошо, вот проблема. Когда я диагностировал, я хотел найти значение $PATH внутри sudo. Однако с sudo -E echo $PATH
, мой пользователь (non-sudo) оболочка разворачивал его автоматически, таким образом, sudo просто видел
echo /home/user/.local/share/virtualenvs/environment-_Sko9eTd/bin:/usr/bin/:......
Попытка sudo -E env
рассказывает нам реальную историю:
LANGUAGE=en_GB:en
# more environment variables ...
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# ^^ doesn't include my Pipenv path
таким образом, на самом деле, sudo -E
не было передающим $PATH
. Для фиксации этого, можно затем видеть этот ответ по подобному вопросу. По существу Вы просто добавляете
Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
в Ваш sudoers файл с visudo
.