ноутбук jupyter под pyenv в systemd выдает только системный питон - PullRequest
0 голосов
/ 09 мая 2018

У меня установлен ноутбук Jupyter под псевдонимом pyenv jupyter. если я запускаю его из консоли (нет pyenv, активируйте jupyter, ноутбуки используют один и тот же порт):

$ export PATH=/home/mortenb/.pyenv/versions/jupyter/bin:$PATH
$ /home/mortenb/.pyenv/versions/jupyter/bin/jupyter-notebook \
  --config=/etc/jupyter/jupyter_notebook_config.py

!python --version
Python 3.6.5

!jupyter --paths
config:
    /home/mortenb/.jupyter
    /home/mortenb/.pyenv/versions/3.6.5/envs/jupyter/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /home/mortenb/.local/share/jupyter
    /home/mortenb/.pyenv/versions/3.6.5/envs/jupyter/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /run/user/1000/jupyter

С корректным ядром все нормально.

Но если я автоматизирую это с помощью сценария systemd, того же пользователя, того же исполняемого файла:

# cat /lib/systemd/system/jupyter_notebook.service 
[Unit]
Description=jupyter notebook as a service

[Service]
PATH=/home/mortenb/.pyenv/versions/jupyter/bin:$PATH
Type=simple
User=mortenb
Group=mortenb
PIDFile=/var/run/jupyter_notebook.pid
ExecStart=/home/mortenb/.pyenv/versions/jupyter/bin/jupyter-notebook --config=/etc/jupyter/jupyter_notebook_config.py 

[Install]
WantedBy=multi-user.target

Я получаю Python 2.7.12 (системный Python с Ubuntu 16.04)

!python --version
Python 2.7.12

!jupyter --paths
config:
    /home/mortenb/.jupyter
    /usr/etc/jupyter
    /usr/local/etc/jupyter
    /etc/jupyter
data:
    /home/mortenb/.local/share/jupyter
    /usr/local/share/jupyter
    /usr/share/jupyter
runtime:
    /home/mortenb/.local/share/jupyter/runtime

Jupyter-notebook имеет следующий shebang в обоих примерах:

#!/home/mortenb/.pyenv/versions/3.6.5/envs/jupyter/bin/python

Любая идея, почему запуск systemd отличается. Спасибо

Ответы [ 2 ]

0 голосов
/ 09 мая 2018
<...>

[Service]
PATH=/home/mortenb/.pyenv/versions/jupyter/bin:$PATH
Type=simple
User=mortenb
Group=mortenb
PIDFile=/var/run/jupyter_notebook.pid
ExecStart=/home/mortenb/.pyenv/versions/jupyter/bin/jupyter-notebook --config=/etc/jupyter/jupyter_notebook_config.py

<...>

Ваш файл модуля синтаксически неверен.

Нет директивы PATH= (ref. systemd.directives (5) ) в файлах системных модулей. Вы должны использовать директиву Environment= для указания переменных среды.

И systemd, похоже, не поддерживает расширение.

На самом деле, systemd поддерживает расширение переменных среды в Environment= и некоторых других директивах. Тем не менее, вы должны использовать ${FOO} как часть слова; $FOO распознается только как собственное слово. Ссылка systemd.service (5) :

Поддерживается базовая замена переменных среды. Используйте «$ {FOO}» как часть слова или как собственное слово в командной строке, и в этом случае он будет заменен значением переменной среды, включая все пробелы, которые он содержит, что приведет к единственному аргумент. Используйте «$ FOO» в качестве отдельного слова в командной строке, в этом случае оно будет заменено значением переменной среды, разделенной на пробел, что приведет к нулю или большему количеству аргументов. Для этого типа раскрытия кавычки учитываются при разбиении на слова, а затем удаляются.

0 голосов
/ 09 мая 2018

Проблема заключалась в том, что путь был задан так же, как и при запуске в shell. И systemd, похоже, не поддерживает расширение.

Замена строки пути в jupyter_notebook.service решила мою проблему:

Environment='PATH=/home/mortenb/.pyenv/versions/jupyter/bin:/home/mortenb/.pyenv/plugins/pyenv-virtualenv/shims:/home/mortenb/.pyenv/shims:/home/mortenb/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
...