PhantomJS не найден на ноутбуке Jupyter - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь экспортировать график Боке в изображение.Для этого я использую метод export_png, который использует PhantomJS и Selenium под ним.Однако я получил RuntimeError

RuntimeError: PhantomJS is not present in PATH or BOKEH_PHANTOMJS_PATH. 
Try "conda install phantomjs" or "npm install -g phantomjs-prebuilt"

Это поведение можно воспроизвести:

Записная книжка

import shutil
shutil.which('phantomjs') or 'not found'
# --> "not found"

С IPython втот же virtualenv

import shutil
shutil.which('phantomjs') or 'not found'
# --> "/home/<user>/miniconda/envs/p36/bin/phantomjs"

[Редактировать]

Сервер ноутбука работает как служба в Linux (Ubuntu).Я думаю, что проблема заключается в том, что, когда я вручную запускаю сервер ноутбука, путь phantomJS хорошо обнаруживается на ноутбуке.Вот подробный файл systemd:

[Unit]
Description=Jupyter Notebook
After=multi-user.target network.target

[Service]
User=<myuser>
Group=<mygroup>
EnvironmentFile=/etc/environment
Type=idle
Restart=always
RestartSec=3
ExecStart=/home/<user>/miniconda3/envs/tensorflow/bin/jupyter-notebook --no-browser --notebook-dir="/home/<user>/src"

[Install]
WantedBy=multi-user.target

[Решение]

Проблема скорее системная, чем проблема Python: $PATH Используется переменная средыодин из пользователей root, а не указанный пользователь.Я не нашел четкого способа загрузить файл .bashrc перед запуском скрипта сервиса.Тогда было решено использовать файл среды, в котором я объявил переменную $PATH так же, как это делается в файле .bashrc.После этого все работает как шарм.

1 Ответ

0 голосов
/ 27 ноября 2018

Не существует (и никогда не будет) встроенного способа загрузки ~/.bashrc указанного пользователя до запуска процесса в systemd.

[Nit: если вы устанавливаетепеременная окружения в ваших точечных файлах, сделайте это в ~/.bash_profile, а не ~/.bashrc.Первый источник получен из всех оболочек входа в систему (примерно один раз для каждого входа в систему), второй - из каждой интерактивной оболочки (и не из оболочки входа в систему, поэтому корневые процессы вашей DE не получат эти переменные).]

systemd не является интерпретатором bash.~/.bashrc может содержать произвольный код bash, а не только назначения переменных среды, поэтому systemd не может реализовать такую ​​функциональность.

Так что, если вам нужно запустить произвольный код оболочки, просто сделайте это явно:

ExecStart=/bin/bash -c '...'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...