openlang

Каталог скриптов от --user не попал в PATH сервиса

Справедливости ради, pip предупреждал. Сообщение о том, что скрипт установлен в каталог не из PATH, проскочило посреди вывода установки, и до него глаза не дошли.

Само происшествие вполне обыденное. pip install --user кладёт консольные скрипты в пользовательскую базу, на Linux это ~/.local, так что они оказываются в ~/.local/bin. В PATH моей оболочки этот каталог есть. Сервис работает под своей учётной записью с куда более коротким PATH, и команда просто не нашлась. python -m site --user-base печатает базу для того интерпретатора, которым его запустили, и это самый простой способ увидеть, куда всё делось.

Привычка, которую стоит вынести, такая. Не давать сервису искать инструменты через PATH. Отдельный venv и полный путь к скрипту или интерпретатору.

Стоит ли ещё где-то пользоваться --user, так и не могу решить. Чаще всего просто делаю venv.

Разговор продолжается 3

Следуя доводам
  1. Ссылка на ответ

    Куда pip положил скрипт и должен ли сервис вообще искать его по имени? Эти два вопроса, по порядку.

    На первый отвечает python -m site --user-base, если запустить его от того же пользователя и тем же интерпретатором, что и сервис. Запуск из своей оболочки расскажет про вашу учётную запись, а это другая пользовательская база. Когда база известна, скрипты лежат в её каталоге bin.

    Теперь второй, и его стоит решить до того, как трогать PATH. Юнит, в котором прописан /srv/app/.venv/bin/tool, работает при любом PATH, который выдаст менеджер служб, потому что shebang скрипта указывает на интерпретатор из venv. Добавить ~/.local/bin в PATH сервиса тоже можно, но тогда сервис зависит от домашнего каталога одной учётной записи.

    А --no-warn-script-location лучше не трогать. В следующий раз именно эту строку с предупреждением и стоит искать в выводе.

  2. Ссылка на ответ

    Часть настройки потихоньку подставляла сама оболочка входа, PATH с ~/.local/bin, и в ваших собственных сессиях он просто оказался правильным. Путаница с интерпретатором обычно начинается там же, с того, какой pip оболочка находит первым.

    Полный путь в юните решает, какая программа запустится. Но всё остальное, что инструмент подхватил из окружения входа, включая переменные, стоит выписать, прежде чем считать сервис исправленным.

  3. Ссылка на ответ

    У первого вопроса ajp пресный ответ. От имени пользователя сервиса python -m site --user-base выдаёт ~/.local его учётной записи, а не моей.

    Теперь у сервиса свой venv, инструмент стоит там, а юнит смотрит на /srv/app/.venv/bin/tool. Под env -i он стартует нормально, вообще без PATH.

Другие стороны того же вопроса

  1. tryEval пропустил нарочно сломанный пакет

    Есть у меня небольшой обход оверлея, который оборачивает каждый пакет в builtins.tryEval и перечисляет упавшие. Он сообщил, ч…

    Ответы 4nix
  2. Ключи for_each - это адреса, а не ярлыки

    Ключ for_each - не ярлык. Это половина адреса ресурса, terraform_data.queue["prod-orders"], и состояние хранит объект именно…

    Ответы 6hcl
  3. Остановленное задание оболочки ещё не завершено

    Пришёл вопрос про правило супервизора, которое считает остановленный процесс завершённым, и маленький пример сразу показывает…

    Ответы 17bashpython