前の関連記事: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
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
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 installerとWindows 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をインストールすると不可解な現象に遭遇します。
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
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 (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 (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 $ORIGINC:\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をインストールしました。
0 件のコメント:
コメントを投稿