2020年11月1日日曜日

46: LibreOfficeまたはOpenOfficeで外部Pythonを使用する

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

バイナリLibreOffice/OpenOfficeディストリビューションで、本記事では。あらゆるバージョンがオーケーなわけではない。フル・バグ修正済Pythonを使用するために。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: Pythonプログラミング言語

この記事の目次


開始コンテキスト


  • 読者は、LibreOfficeまたはApache OpenOfficeの基本的知識を持っている。
  • 読者は、Pythonプログラミング言語の基本的知識を持っている。

ターゲットコンテキスト



  • 読者は、LibreOfficeまたはApache OpenOfficeのバイナリディストリビューションで、Pythonマクロ群に外部Pythonを使用する方法を知る。

オリエンテーション


本記事は、LibreOfficeまたはApache OpenOfficeのバイナリディストリビューションで、Pythonマクロ群に外部Pythonを使用するためのものです: もしも、外部Python UNOプログラムをご開発されるのであれば、本記事の措置のほとんどは必要でないでしょう; もしも、LibreOfficeまたはApache OpenOfficeをソースディストリビューションからビルドされるのであれば、別の方法の方が、用途が広いでしょう。

LinuxおよびWindowsプラットフォームが論じられますが、本措置は、macOSでも同様なはずです。

本記事の範疇では、任意のPythonバージョンが使用できるわけではありません; もしも、本記事の措置では使用可能でないPythonバージョンをお使いになりたいのであれば、LibreOfficeまたはApache OpenOfficeをソースディストリビューションからビルドされる(以降の記事で論じられる予定です)必要があるでしょう。

ト書き
Hypothesizer 7、Objector 46A、Objector 46Bが、コンピュータの前にいる。


本体


1: あなたのLibreOfficeまたはApache OpenOfficeは、内部Pythonを使用しているかもしれないし、外部Pythonを使用しているかもしれない


Hypothesizer 7
あなたのLibreOfficeまたはApache OpenOfficeは、内部Pythonを使用していますか、それとも、外部Pythonを使用していますか?

ト書き
Objector 46Aは首を振り、それを見て、Objector 46Bも首をふる、同じように。

Hypothesizer 7
. . .それはどういう意味ですか、サー?どちらも使っていませんか?

Objector 46A
知らない。何か使っているかもしれない、俺のPythonマクロが動くから。

Hypothesizer 7
サー、間違いなく、内部Pythonか外部Pythonを使っていますよ。

Objector 46A
どうでもいいが。

Hypothesizer 7
あなたはどうです、マダム?

Objector 46B
知らない。それをどうやって知ると想定されてるわけ?

Hypothesizer 7
もしも、LibreOfficeまたはApache OpenOfficeを、Webページからダウンロードされたバイナリディストリビューションを使ってインストールされたのであれば、まず間違いなく、内部Pythonが使用されています。

Objector 46B
もちろん、そうしたわ; 他にどうインストールするっていうの?

Hypothesizer 7
If you use Linux, you can install it via the packages manager of the Linux distribution. Linuxをご使用でしたら、そのLinuxディストリビューションのパッケージマネージャーを介してインストールされることができます。

Objector 46B
「Linux」?「Linux」は使ってないわ、それが何だろうが. . .

Objector 46A
俺は、Webページからダウンロードしたバイナリパッケージでインストールした、Linuxで。

Hypothesizer 7
より確実に知るためには、LibreOfficeまたはApache OpenOfficインストールの'program'ディレクトリに'python-core-%version%'ディレクトリがあるか否かをチェックされるとよいでしょう、それが、内部Pythonを格納しています。


2: あなたが外部Pythonを使用したいかもしれない理由


Objector 46A
いずれにせよ、使われているPythonには、いろいろ欠けてるんだ!例えば、'tkinter'をインポートできない!

Hypothesizer 7
はい、それは、内部Pythonは制限されたPythonだからです。

Objector 46A
もっと致命的なことに、'pip'が欠けていてインストールもできない!

Hypothesizer 7
そうでしょうね。

Objector 46A
どうしろというんだ?!

Hypothesizer 7
制限内で我慢するように想定されていると思われますが、実のところ、そうされる必要はありません: あなたのLibreOfficeまたはApache OpenOfficeに外部のフルPythonを使わせることができます。


3: 恣意的な任意なPythonでも使用できるというわけではない


Objector 46A
それじゃあ、ただ、あるPythonをインストールして、そのパスを登録すればいいということか?

Hypothesizer 7
そうではありません、サー、実のところ: 恣意的な任意のPythonをご使用になれるというわけではありません。

Objector 46A
はあ?おかしいだろう。なんで、自分の好きなPythonを使えない、自分のコンピュータで!

Hypothesizer 7
思い出していただきたいのですが、Pythonは、バイナリ互換性という点において、それほど優れておりません。ご存じのとおり、'pyc'ファイルやCやC++によるPythonエクステンションは、大抵、バージョン間で互換がありません。今回の場合、致命的な問題は、'pyuno.so'(Linuxの場合)または'pyuno.pyd'(Windowsの場合)Pythonエクステンションであり、それは、特定のPythonバージョンでビルドされています。

Objector 46A
ふーむ、そいつは残念だな。

Hypothesizer 7
間違いなく、その特定のバージョンそのもののPythonをご使用になれますし、多分、マイナーバージョンが同じPythonもご使用になれます、しかし、マイナーバージョンが違うPythonをご使用になれる見込みは薄いでしょう。

Objector 46A
「マイナーバージョン」ってなんだ?

Hypothesizer 7
例えば、'3.7.8'の'3.7'です。

Objector 46A
えーと、'3.7.6'の代わりに'3.7.8'を使って、意味あるかい?

Hypothesizer 7
あると私は思います: マイクロバージョンは、バグ修正のためのものであり、それらのバグがあなたのプログラムをかじっているかもしれません。

Objector 46A
それはそうだ。しかし、'3.8'は使えないと?

Hypothesizer 7
本記事のコンテストにおいては、多分できないでしょう。もしも、どうしても'3.8'をご使用になりたいのであれば、LibreOfficeまたはApache OpenOfficeをソースディストリビューションからビルドなさる必要があるでしょう。

Objector 46A
そうすれば、どんなバージョンでも使えるのか?

Hypothesizer 7
「どんなバージョン」でもとは申しません、ソース非互換性があるかもしれませんから、しかし、ほとんどの実際的なバージョンはオーケーなはずです。

Objector 46A
「実際的なバージョン」とはどういう意味だ?

Hypothesizer 7
今、'3.0'を使用しようとされないのではないでしょうか、サー?

Objector 46A
多分、しないだろうな。


4: 実行する


Hypothesizer 7
それでは、実行しましょう。

第1に、妥当なPythonをインストールします。

Objector 46B
どうやって?

Hypothesizer 7
えーと、お好きなようにされることができますが、私たちは、特定のバージョンをインストールしようとしているので、多分、それをPythonダウンロードページからダウンロードするでしょう。

ト書き
Hypothesizer 7は、Pythonダウンロードページ を開き、'3.7.8' 「XZ compressed source tarball」ファイルを'~/myData/downloadedFiles'というディレクトリへダウンロードする。

Hypothesizer 7
私たちは'3.7.8' 「XZ compressed source tarball」を使用しますが、それは、これはLinuxマシンであり、私のLibreOfficeの内部Pythonが'3.7.6'だからです。

Objector 46B
これ「Linux」なの?. . .気持ち悪い!

Hypothesizer 7
. . .あなたの感覚は私には理解できません、しかし、64ビットWindowsでは、あなたは多分「Windows x86-64 executable installer」をダウンロードされるでしょう。

いずれにせよ、それを'~/myApplications/execution/python'へインストールします、以下のように。

ト書き
Hypothesizer 7は、ターミナルをオープンし、以下のコマンド群を実行する。

@bash ソースコード
mkdir -p ~/myData/downloadedFiles/python
tar -xvf Python-3.7.8.tar.xz -C ~/myData/downloadedFiles/python --strip-components=1
cd ~/myData/downloadedFiles/python
./configure --enable-shared --prefix=${HOME}/myApplications/execution/python
make
make install

Objector 46B
気持ち悪い!

Hypothesizer 7
. . .Windowsでは、当該インストーラーを実行されればよいだけです(インストール先は'D:\python'だと想定しましょう)。

ト書き
上記コマンド群は、正常に終了する。

Hypothesizer 7
次に、Pythonのメインのシェアード(またはダイナミック、Windowsの場合)ライブラリ群のパス(今回の場合、'~/myApplications/execution/python')を'LD_LIBRARY_PATH'(または、'PATH'、Windowsの場合)に設定します、LibreOfficeまたはApache OpenOfficeのプログラムパスよりも優先になるように(もしも、LibreOfficeまたはApache OpenOfficeプログラムパスがその環境変数に入っているならば)。

Objector 46A
それじゃあ、パスを登録するんじゃないか、結局!

Hypothesizer 7
そうしないとは申しませんでした、サー。それだけでは十分ではないと申し上げました。

Objector 46A
. . .

Hypothesizer 7
そこで、私たちは、'program'ディレクトリ内の、Linuxでは'pythonloader.unorc'、Windowsでは'pythonloader.uno.ini'という名前のファイルを編集します、以下のように。

@pythonloader.unorc ソースコード
[Bootstrap]
PYUNO_LOADER_PYTHONHOME=file:///home/tanichida/myApplications/execution/python
PYUNO_LOADER_PYTHONPATH=$PYUNO_LOADER_PYTHONHOME/lib/python3.7 $PYUNO_LOADER_PYTHONHOME/lib/python3.7/lib-dynload $PYUNO_LOADER_PYTHONHOME/lib/python3.7/site-packages $ORIGIN

@pythonloader.uno.ini ソースコード
[Bootstrap]
PYUNO_LOADER_PYTHONHOME=file:///D:/python
PYUNO_LOADER_PYTHONPATH=$PYUNO_LOADER_PYTHONHOME/Lib $PYUNO_LOADER_PYTHONHOME/Lib/site-packages $ORIGIN

ト書き
Hypothesizer 7は、当該ファイルを編集する。

Objector 46A
それは、いくつかのPythonモジュール群パスを設定しているんだな?

Hypothesizer 7
はい、サー。

これで、コンフィギュレーションは完了しました。

もちろん、もしも、LibreOfficeまたはApache OpenOfficeのインスタンスが起動中であれば、それを再起動しなければなりませんが。


5: テストする


Hypothesizer 7
それでは、テストしましょう。

あるPythonモジュールファイル、'PythonEnvironmentChecker.py'をLibreOfficeまたはApache OpenOfficeディレクトリの'share/Scripts/python'に作成します、以下のコンテンツで。

@Python ソースコード

import sys
from com.sun.star.frame import XDesktop2
from com.sun.star.lang import XComponent
from com.sun.star.script.provider import XScriptContext
from com.sun.star.text import XText

XSCRIPTCONTEXT: XScriptContext

def checkPythonEnvironment () -> None:
	l_unoDesktop: XDesktop2 = XSCRIPTCONTEXT.getDesktop ()
	l_currentUnoDocument: XComponent = l_unoDesktop.getCurrentComponent ()
	if hasattr (l_currentUnoDocument, "Text"):
		l_unoText: XText = l_currentUnoDocument.getText ()
		l_unoText = l_unoText.getEnd ()
		l_unoText.setString ("The Python environment: version -> {0:s}, paths -> {1:s}\n".format (sys.version, str (sys.path)))
		return None

ト書き
Hypothesizer 7は、ファイルを示す。

Objector 46B
. . .それは何をやってるの?

Hypothesizer 7
そのコードは、ある文字列をカレントのWriterドキュメントに書きますが、そうする方法はここでの話題ではありません。ただ、書かれる文字列がPythonバージョンおよびPythonモジュール群パス群からなっており、それが、私たちのコンフィギュレーションの有効性を証明するという点にご注意ください。

ト書き
Hypothesizer 7は、あるLibreOfficeインスタンスを開始し、その中に、あるWriterドキュメントをオープンし、当該マクロを、'Tools(ツール)' -> 'Macros(マクロ)' -> 'Run Macro...(マクロを実行)'メニュー項目から実行する。以下が、そのドキュメントに書かれ、Objector 46AとObjector 46Bがぼんやりと見つめる。

@出力
The Python environment: version -> 3.7.8 (default, Jul 31 2020, 08:59:27) 
[GCC 7.5.0], paths -> ['/home/tanichida/myApplications/execution/python/lib/python3.7', '/home/tanichida/myApplications/execution/python/lib/python3.7/lib-dynload', '/home/tanichida/myApplications/execution/python/lib/python3.7/site-packages', '/opt/libreoffice6.4/program', '/home/tanichida/myApplications/libraries/python', '/home/tanichida/myApplications/execution/python/lib/python37.zip']

Hypothesizer 7
. . .なぜ、何の反応もされないのですか?退屈させましたか?

Objector 46B
えーと、ご心配なく、確かに、正しいバージョンを示してるわ。


参考資料


  • Python Software Foundation. (2020). Download Python | Python.org. Retrieved from https://www.python.org/downloads/
<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>