python - jupyter 笔记本上找不到 PhantomJS

标签 python phantomjs systemd

我正在尝试将 Bokeh 图导出到图像。为此,我使用了 export_png 方法,该方法在底层使用了 PhantomJS 和 Selenium。但是,我遇到了运行时错误

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"

在同一个 virtualenv 中使用 IPython

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

[解决方案]

这个问题更多的是一个 systemd 问题,而不是 Python 问题:使用的 $PATH 环境变量是 root 用户的环境变量,而不是指定用户的环境变量。在运行服务脚本之前,我没有找到任何明确的方法来加载 .bashrc 文件。然后,解决方案是使用一个环境文件,其中我声明了 $PATH 变量,其方式与在 .bashrc 文件中的声明方式相同。此后一切都变得很糟糕。

最佳答案

没有(也永远不会有)内置的加载方式 ~/.bashrc在 systemd 中启动进程之前指定用户。

[Nit:如果您要在点文件中设置环境变量,请在 ~/.bash_profile 中进行设置,不是~/.bashrc 。前者由所有登录 shell 获取(大约每次登录一次),后者由每个交互式 shell 获取(并且不是由登录 shell 获取,因此 DE 的根进程不会获取这些变量)。]

systemd 不是 bash 解释器。 ~/.bashrc可能包含任意 bash 代码,而不仅仅是环境变量赋值,因此 systemd 无法实现此类功能。

因此,如果您需要运行任意 shell 代码,只需显式执行即可:

ExecStart=/bin/bash -c '...'

关于python - jupyter 笔记本上找不到 PhantomJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53464583/

相关文章:

python - 自动调整命令行窗口大小

python - 具有出色表格支持的 Wiki 标记语言

linux - 每个程序使用字体

python - 如何在由 uswgi 提供服务并由 systemd 服务启动的虚拟环境中配置 Django 应用程序?

Systemd 单元,使用外部脚本检查状态

python - 搜索并用 python 替换

javascript - 当我将 HTML 放入 "include"时,为什么我的 javascript 不起作用?

javascript - 在 phantomjs 中打开的页面之外定义页面评估

node.js - 错误 - 运行 spookyjs

c++ - swig - 从 C++ 到 Python。链接系统库