Установите библиотеки pip для пользователя root - PullRequest
1 голос
/ 21 февраля 2020

У меня есть служба systemd, которая регулярно читает первую строку файла root, преобразует его и затем использует png_util:

import png_util

with open('root-owned-file', 'r') as f:
  f.read()

...rest of logic...

Теперь, когда запускается демон systemd, он не ' У меня нет доступа к библиотеке png_util, которую я установил с помощью pip (pip install png_util), потому что она устанавливается только для устанавливающего пользователя. Это также происходит, когда я запускаю сценарий с помощью sudo:

ModuleNotFoundError: No module named 'png_util'

Если я читаю принадлежащий мне файл и выполняю сценарий как пользователь, все работает нормально.

Systemd service:

[Unit]
Description=PNG

[Service]
ExecStart=/tmp/pngreader

[Install]
WantedBy=multi-user.target

Трюк заключается в простом использовании pip install --user root и последующей установке PYTHONPATH для пользователя root каким-либо образом?

1 Ответ

3 голосов
/ 21 февраля 2020

Я думаю, вы можете получить то, что вам нужно, в виртуальной среде.

Вам необходимо создать виртуальную среду специально для этого сценария. Вы установите все необходимые вам пакеты с нужными версиями в этой среде. Пока вы запускаете свой сценарий с этой виртуальной средой, все будет доступно. См. Документацию venv здесь

Чтобы создать виртуальную среду, вы запускаете python3 -m venv <your_venv_path> с путем, где вы находитесь хотите сохранить его, например, ~ / .venvs / my_project /

Чтобы установить пакеты, вы должны сначала сделать его активным, а затем запустить pip

source <your_venv_path>/bin/activate
pip install png_util

Здесь у вас будет ваша виртуальная среда готов и ваш пакет установлен. Если вы запустите свой сценарий с активной виртуальной средой, пакет будет доступен.

Теперь, поскольку ваш сценарий является демоном , именно так вы убедитесь, что он работает в вашей виртуальной среде . По сути, виртуальная среда создает копию Python в, и вы просто добавляете в свой скрипт инструкцию по использованию этой «копии» python. Вы делаете это, просто добавляя #!<your_venv_path>/bin/python в качестве первой строки вашего скрипта.

Таким образом, когда ваш скрипт запускается, он запускается в той виртуальной среде, где установлены все пакеты.

PS : Потенциально все может работать, просто запустив pip от sudo, потому что он установит пакетную систему в целом и сделает ее доступной для всех пользователей. Но этот вариант крайне нежелателен из-за угроз безопасности, которые он создает, см. Этот пост с рисками безопасности при запуске sudo pip

Надеюсь, это поможет !!

...