LibreOffice(29)Pythonインタプリタの置き換えは断念

2014-03-23

旧ブログ

t f B! P L

前の関連記事:LibreOffice(28)4.1.4.2から4.2.2.1にアップグレード


LibreOffice4.2.2.1付属のPython3.3.3(バンドルPython)をPythonのサイトからインストールしたPython(システムPython)に置き換えようと四苦八苦しました。結果としてPythonインタプリタの置き換えは断念しました。

Scripting Frameworkではpython.exeではなくてsoffice.binでpyが実行される


LibreOfficeに働きかけるPythonスクリプトはLibreOffice(5)PythonでLibreOfficeが動く仕組み:UNOでみたように「マクロ」「オートメーション」「UNOコンポーネント」の3つのモードで動きます。

LibreOfficeをインストールするとpython.exeが付属してくるのでマクロモードでもそれを実行するScripting Frameworkがこのpython.exeを呼び出して実行しているのかと思っていました。

でもその認識は間違っていたようです。

以後の作業はLibreOffice(4)PyCharmからLibreOfficeを動かす(オートメーション)までの設定が終わったLibreOfficeとPyCharmで行います。

Pythonスクリプトが実行されたインタプリタについての情報を得るためにPyCharmでversion_check.pyを作ります。
#version_check.py
import sys
def version_check():
    oDoc = XSCRIPTCONTEXT.getDocument()
    oText="Pythonインタプリタのバージョン\n"+sys.version+"\n\n"
    oText=oText+"Pythonインタプリタの絶対パス\n"+sys.executable+"\n\n"
    oText=oText+"Pythonモジュール検索パス\n"+"\n".join(sys.path)
    oDoc.getText().setString(oText)
if __name__ == "__main__":
    import unopy
    XSCRIPTCONTEXT = unopy.connect()
    if not XSCRIPTCONTEXT:
        print("Failed to connect.")
        sys.exit(0)
    version_check()
このversion_testをWriterのマクロで呼び出すと以下の情報が得られました。

Pythonインタプリタのバージョン
3.3.3 (default, Feb 26 2014, 23:40:42) [MSC v.1600 32 bit (Intel)]

Pythonインタプリタの絶対パス
C:\Program Files (x86)\LibreOffice 4\program\soffice.bin

Pythonモジュール検索パス
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\site-packages
C:\Program Files (x86)\LibreOffice 4\program
C:\Program Files (x86)\LibreOffice 4\program\python33.zip
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\DLLs
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3
C:\Program Files (x86)\LibreOffice 4\share\extensions\dict-en\pythonpath

Pythonインタプリタはsoffice.binになっています。

Python-UNO bridge[Solved] Python 3 and Calc (View topic) • Apache OpenOffice Community ForumでバンドルPythonと異なるバージョンのシステムPythonを使いたいならpyunoモジュールをC++で自分でコンパイルしないといけないと諭されている意味がようやく飲み込めました。

ということで、システムPythonの利用は断念します、、、という結論に至ったのですがここに至るまで四苦八苦しました。

version_check.pyをPyCharmから実行してみます。つまりオートメーションで実行します。

Pythonインタプリタのバージョン
3.3.3 (default, Feb 26 2014, 23:40:42) [MSC v.1600 32 bit (Intel)]

Pythonインタプリタの絶対パス
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\bin\python.exe

Pythonモジュール検索パス
C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\python\untitled
C:\Program Files (x86)\LibreOffice 4\program
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\site-packages
C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\python\untitled
C:\Program Files (x86)\LibreOffice 4\program\python33.zip
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\DLLs
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\bin
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3

Pythonインタプリタはprogram\python-core-3.3.3\bin\python.exeになっています。

これはPyCharmで指定したC:\Program Files (x86)\LibreOffice 4\program\python.exeとも違います。

Pythonインタプリタのバージョンはマクロのときと全く同じですね。

Pythonモジュール検索パスは以下が増えています。

C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\bin
C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\python\untitled

version_check.pyとpython.exeが置いてあるフォルダが増えていますね。

マクロとオートメーションでのこの違いを知っておかないと、オートメーションで動くのにマクロだと動かないというスクリプトを作ってしまいそうですね。

32bit版Python3.3.5をインストール


Pythonインタプリタの置き換えについての失敗の記録を書いておきます。

Pythonのバージョン表記は例えば、3.4.5の場合は、major 3、minor 4、micro 5となります(version_info)。

Python-UNO bridgeにはバンドルPythonと同じバージョンのシステムPythonを使うように書いてありますがPython 3.3.3 Release | Python.orgにはバグフィックスバージョンの3.3.5が推奨されているので、microバージョンの違いには目をつぶって3.3.5をインストールすることにしました。

Python 3.3.5のダウンロードページにいきます。

Windows x86-64 MSI installerWindows x86 MSI installerがあります。

LibreOffice4.2.2.1付属のPython3.3.3は32bit版なのでWindows x86 MSI installerをダウンロードしました。

ダウンロードしたpython-3.3.5.msiを実行します。


Pythonをインストールする - Dive Into Python 3 日本語版のお勧めに従ってUtility ScriptsとTest suiteはインストールしないようにしました。

C:\Python33にインストールされました。

これでシステムPythonのインストール完了です。

システムPythonをインストールしただけでバンドルPythonのバージョンも変わる


システムPythonをインストールすると不可解な現象に遭遇します。

version_check.pyをPyCharmから実行してみます。

Pythonインタプリタのバージョン
3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:37:12) [MSC v.1600 32 bit (Intel)]

Pythonインタプリタの絶対パス
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\bin\python.exe

Pythonモジュール検索パス
C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\python\untitled
C:\Program Files (x86)\LibreOffice 4\program
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\site-packages
C:\Users\ユーザー名\AppData\Roaming\LibreOffice\4\user\Scripts\python\untitled
C:\Program Files (x86)\LibreOffice 4\program\python33.zip
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\DLLs
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\bin
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3

Pythonインタプリタは変更になっていないのにバージョンが3.3.5に変わっています。

おかしいですね。

マクロからversion_check.pyを実行しても3.3.3のままです。

マクロのインタプリタをシステムPythonには変更できない?


Python-UNO bridgeにPython2.2の代わってPython2.3を使う方法が書いてありますので同じようにやってみます。

C:\Program Files (x86)\LibreOffice 4\program\pythonloader.uno.ini

これをメモ帳などで開いて編集します。
[Bootstrap]
PYUNO_LOADER_PYTHONHOME=$ORIGIN/python-core-3.3.3
PYUNO_LOADER_PYTHONPATH=$ORIGIN/python-core-3.3.3/lib $ORIGIN/python-core-3.3.3/lib/site-packages $ORIGIN
これを以下のように書き換えて保存します。
[Bootstrap]
PYUNO_LOADER_PYTHONHOME=file:///C:/Python33
PYUNO_LOADER_PYTHONPATH=$PYUNO_LOADER_PYTHONHOME/lib $ORIGIN/python-core-3.3.3/lib/site-packages $ORIGIN
この時点でLibreOfficeを再起動してversion_check.pyをマクロで実行してみます。

Pythonインタプリタのバージョン
3.3.3 (default, Feb 26 2014, 23:40:42) [MSC v.1600 32 bit (Intel)]

Pythonインタプリタの絶対パス
C:\Program Files (x86)\LibreOffice 4\program\soffice.bin

Pythonモジュール検索パス
C:\Python33\lib
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\site-packages
C:\Program Files (x86)\LibreOffice 4\program
C:\Program Files (x86)\LibreOffice 4\program\python33.zip
C:\Python33\DLLs
C:\Python33
C:\Python33\lib\site-packages

インタプリタは3.3.3のままですが、モージュール検索パスがシステムPythonのものに変わっていますね。

バンドルPythonにはないSQliteモジュールをマクロで動かすことができました。

パスを指定せずに作ったdbファイルはC:\Program Files (x86)\LibreOffice 4\programに作られました。

C:\Program Files (x86)\LibreOffice 4\program\python.exeをインタプリタに指定しているオートメーションではSQLiteは動きません。

マクロでは、Python3.3.3の表示のままシステムPythonのSQLiteモジュールが使える、

オートメーションではPython3.3.5と表示されているのにSQLiteモジュールが使えない、

というけったいなことになっています。

つぎにマクロのインタプリタをシステムPythonのものに変更します。

C:\Program Files (x86)\LibreOffice 4\program\python.exe
C:\Program Files (x86)\LibreOffice 4\program\python3.dll
C:\Program Files (x86)\LibreOffice 4\program\python33.dll
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3

これらの名前の最後に".original"とでもつけて改名して無効にします。

LibreOfficeを再起動してWriterのマクロからversion_check.pyを実行します。

Pythonインタプリタのバージョン
3.3.5 (v3.3.5:62cf4e77f785, Mar  9 2014, 10:37:12) [MSC v.1600 32 bit (Intel)]

Pythonインタプリタの絶対パス
C:\Program Files (x86)\LibreOffice 4\program\soffice.bin

Pythonモジュール検索パス
C:\Python33\lib
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\lib\site-packages
C:\Program Files (x86)\LibreOffice 4\program
C:\Windows\system32\python33.zip
C:\Python33\DLLs
C:\Python33
C:\Python33\lib\site-packages

インタープリタのバージョンが3.3.5に変わりましたね。

ところがインタプリタの絶対パスはsoffice.binのままです。

ひょっとしてsoffice.binがC:\Python33\python.exeを読みにいっているのではないかと思ってC:\Python33\python.exe.originalと変名してWriterを再起動してマクロからversion_check.pyを実行しても同じ結果です。

やっぱりインタプリタはsoffice.binのままなんです。

sys.versionはどこをみて結果を出力しているのでしょうね。

こんどはPyCharmからオートメーションでversion_check.pyを実行してみます。

インタプリタのC:\Program Files (x86)\LibreOffice 4\program\python.exe
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3\bin\python.exeはないので、C:\Python33\python.exeを指定します。

Error running version_check: Cannot run program "C:\Program Files (x86)\LibreOffice 4\program\python.exe"

version_check.pyをオートメーションで実行してみると指定したインタプリタではないC:\Program Files (x86)\LibreOffice 4\program\python.exeを要求されて動きません。

もうお手上げですね。

LibreOfficeでシステムPythonを使うことは諦めることにしました。

システムPythonをアンイストールしないとオートメーションで3.3.5と表示される


変更箇所を元に戻します。

C:\Program Files (x86)\LibreOffice 4\program\pythonloader.uno.ini

このファイルの内容を以下に変更。
[Bootstrap]
PYUNO_LOADER_PYTHONHOME=$ORIGIN/python-core-3.3.3
PYUNO_LOADER_PYTHONPATH=$ORIGIN/python-core-3.3.3/lib $ORIGIN/python-core-3.3.3/lib/site-packages $ORIGIN
C:\Program Files (x86)\LibreOffice 4\program\python.exe
C:\Program Files (x86)\LibreOffice 4\program\python3.dll
C:\Program Files (x86)\LibreOffice 4\program\python33.dll
C:\Program Files (x86)\LibreOffice 4\program\python-core-3.3.3

変更したこれらのファイル名を元に戻します。

PyCharmでプロジェクトのインタプリタをC:\Program Files (x86)\LibreOffice 4\program\python.exeへ設定。

これで元に戻ったはずです。

version_check.pyをマクロで実行すると変更前と同じ状態に戻りました。

ところがオートメーションではインタプリタのバージョンが3.3.5のままなんです。

これはシステムPythonをアンイストールしないと3.3.3に戻りませんでした。

SQLiteをLibreOfficeのPythonマクロで使うにはシステムPythonから必要なファイルを抜き出しておいてからアンイストールしましょう。

SQLiteについては次回にやります。

参考にしたサイト


Python-UNO bridge
LibreOfficeでPythonを使えるようにするPyUNOのマニュアルです。

[Solved] Python 3 and Calc (View topic) • Apache OpenOffice Community Forum
バンドルPython2.6に代わりシステムPython3を使う方法を質問しています。

28.1. sys — システムパラメータと関数 — Python 3.3.3 ドキュメント
Pythonのsysモジュールの使い方のヘルプ。

Releases | Python.org
Pythonダウンロードサイト。

Pythonをインストールする - Dive Into Python 3 日本語版
ここを参考にシステムPythonをインストールしました。

次の関連記事:LibreOffice(30)PythonのSQLiteモジュールを導入

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ