linuxBean14.04(152)AnacondaとJupyter NotebookとLibreOffice5.2(成功編)

linuxBean14.04(150)AnacondaとJupyter NotebookとLibreOffice5.2(失敗編)でこれらの連携がうまくいきませんでしたが、どうも納得できなくてさらに突っ込んで調べてみると原因がわかって解決しました。

前の関連記事:linuxBean14.04(151)LibreOfficeマクロ開発環境の構築:その2


原因はplatforms.pyのバグだった

pq@pq-VirtualBox:~$ /opt/libreoffice5.2/program/python ~/anaconda3/envs/py35/bin/jupyter notebook
Traceback (most recent call last):
  File "/home/pq/anaconda3/envs/py35/bin/jupyter-notebook", line 4, in <module>
    import notebook.notebookapp
  File "/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/notebook/notebookapp.py", line 32, in <module>
    from zmq.eventloop import ioloop
  File "/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/zmq/__init__.py", line 34, in <module>
    from zmq import backend
  File "/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/zmq/backend/__init__.py", line 21, in <module>
    if platform.python_implementation() == 'PyPy':
  File "/opt/libreoffice5.2/program/python-core-3.5.0/lib/platform.py", line 1332, in python_implementation
    return _sys_version()[0]
  File "/opt/libreoffice5.2/program/python-core-3.5.0/lib/platform.py", line 1295, in _sys_version
    repr(sys_version))
ValueError: failed to parse CPython sys.version: '3.5.3 |Continuum Analytics, Inc.| (default, Mar  6 2017, 11:57:42) \n[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)]'
linuxBean14.04(150)AnacondaとJupyter NotebookとLibreOffice5.2(失敗編)のときと他のマシンでやってみるとこんなエラーがでてきました。

それでこのエラーメッセージが検索してみるとpython - Praw "failed to parse CPython sys.version" when creating Reddit object - Stack OverflowこのQ&Aを見つけました。

sys.versionのエラーがでるのはplatform.pyの正規表現のバグのようです。


MeldでLibreOffice5.2のバンドルPython3.5.0とAnaconda4.3.1のPython3.5.3のplatform.pyを比較してみるとsys.versionの正規表現が変更になっていました。

左側が3.5.3のものです。

1.0.8 - changed Windows support to read version from kernel32.dll
1.0.7 - added DEV_NULL

platform.pyのhistoryをみるとPython3.5.0の付属のplatform.pyは1.0.7で、Python3.5.3の1.0.8とはWindows関連が変わっただけのように見えますが、そのほかいくつか変更点がありました。

Anacondaのplatform.pyへのパスもsites.pthに加えているのですが、LibreOffice5.2のバンドルPythonインタープリターを実行するときはバンドルPythonのplatform.pyが読み込まれてしまいます。

なので、もうバンドルPythonのplatform.pyをAnacondaのものと置き換えることにしました。

LibreOffice5.2のバンドルPythonのplatform.pyをAnacondaのものと置き換える


/opt/libreoffice5.2/program/python-core-3.5.0/lib/platform.pyをplatform.py.bkと改名した後/home/pq/anaconda3/envs/py35/lib/python3.5/platform.pyを同じフォルダにコピーしました。
/home/pq/anaconda3/envs/py35/lib/python35.zip
/home/pq/anaconda3/envs/py35/lib/python3.5
/home/pq/anaconda3/envs/py35/lib/python3.5/plat-linux
/home/pq/anaconda3/envs/py35/lib/python3.5/lib-dynload
/home/pq/.local/lib/python3.5/site-packages
/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages
/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/Sphinx-1.5.1-py3.5.egg
/home/pq/anaconda3/envs/py35/lib/python3.5/site-packages/setuptools-27.2.0-py3.5.egg
/home/pq/.config/libreoffice/4/user/Scripts/python
~/.local/lib/python3.5/site-packagesにこのsites.pthを置きました。

/opt/libreoffice5.2/program/python ~/anaconda3/envs/py35/bin/jupyter notebook

これでLibreOfficeのバンドルPythonでJupyter Notebookが起動できました。

/opt/libreoffice5.2/program/python ~/anaconda3/envs/py35/bin/jupyter notebook --notebook-dir=~/.config/libreoffice/4/user/Scripts/python

このコマンドでLibreOfficeのマイマクロフォルダでJupyter Notebookを起動することができました。

あとはlinuxBean14.04(88)LibreOffice5をIPython Notebookから操作すると同様にランチャを作成しておきました。

/opt/libreoffice5.2/program/python  /home/pq/anaconda3/envs/py35/bin/jupyter notebook --notebook-dir= /home/pq/.config/libreoffice/4/user/Scripts/python

ランチャのコマンドでは~は展開しておかないといけません。

ちなみにlinuxBean14.04(150)AnacondaとJupyter NotebookとLibreOffice5.2(失敗編)と同様にして/opt/libreoffice5.2/program/pythonでコンソールでnumpyをインポートすると失敗するのにJupyter Notebookからだとnumpyのインポートはできました。

なぜかはよくわかりません。

(2017.3.27追記。ちなみにIPython Notebookでモジュールから出力したHTMLタグを有効にする方法で書いたIPython Notebookと同じく、モジュールを更新したときはrestart the kernelボタンをクリックしないとJupyter Notebookに読み込んだモジュールは更新されません。エラーメッセージは更新されたコードがでてくるのでモジュールが更新されているものと勘違いして永遠と無駄な時間を使うことになります。)

(2017.4.1追記。この方法でもインタープリターはLibreofficeのものではなくAnacondaのものになっているのかもしれません。linuxBean14.04(160)Pythonのsys.executableは環境変数PATHを参照しているらしい参照。)

参考にしたサイト


python - Praw "failed to parse CPython sys.version" when creating Reddit object - Stack Overflow
platforms.pyのsys.versionを得る正規表現のバグを指摘しています。

次の関連記事:linuxBean14.04(153)BashEclipseをEclipse 4.6 Neon.2にインストールする

PR

0 件のコメント:

コメントを投稿