Home > コンピュータ > LibreOffice > マクロ > Python > ドキュメント > マクロ言語としてのPython

マクロ言語としてのPython [OpenOffice Wikiの和訳]

新規作成日 2022-03-07
最終更新日

このページの内容は、OpenOffice Wiki 「Python as a macro language」 の和訳です。

翻訳時の翻訳元のページの最終更新日時は 2021年2月3日 (水) 13:21 です。


Pyunoは、OpenOffice.org 2.0に最初に付属したApacheOpenOfficeスクリプト・フレームワークをサポートしています。現在のサポートは、コア・フレームワークに限定されています。つまり、標準の[ツール/マクロ]ダイアログを介したマクロの実行と割り当ては正常に機能しますが、マクロの編集とデバッグは、(単に開発リソースが不足しているため)ApacheOpenOfficeのUIに統合されていません。お気に入りのテキスト・エディタを使用して、Pythonスクリプトを作成および変更します。

スクリプトの場所

Script Location

Apache OpenOfficeで実行されるスクリプトは、次の場所に保存できます。:

Apache OpenOfficeで実行されるスクリプトの場所

Apache OpenOfficeのユーザー・ディレクトリ

これは、自作のPythonスクリプトの標準的な場所です。スクリプト・ファイルは、ファイル・システム内に保存されるだけです。ディレクトリの場所は、使用するApache OpenOfficeのバージョンとオペレーティング・システムに依存します。いくつかの例は、次のとおりです。:

OpenOffice 2.x

  • windows - C:\Documents and Settings\<current-user\>Application Data\OpenOffice.org 2.0\user\Scripts\python
  • unix - ~/.openoffice.org.2.0/user/Scripts/python, ~/.openoffice.org.2.0/user/Scripts/python

OpenOffice 3.x

  • windows 7 - C:\Users\<current-user>\AppData\Roaming\OpenOffice.org\3\user\Scripts\python
  • unix - ~/.openoffice.org/3/user/Scripts/python

最後のpythonサブディレクトリを最初に作成する必要がある場合があることに注意してください。pythonが、完全に小文字で書かれていることを確認してください。あなたは、深くネストされた任意のサブディレクトリを追加できます。これらのディレクトリの名前は、UIに反映されます。

例:dynamicDialog.pyファイルは、単純に、上記のディレクトリに配置できます。その後、[ツール] / [マクロ] / [マクロの実行]ダイアログを開き、上の図に示されている位置に移動します。[実行]をクリックしてPythonスクリプトを実行すると、プッシュボタンとラベルフィールドが含まれている別のダイアログが開きます。ボタンをクリックすると、ラベルフィールド内の数が増えます。Escキーを押すと、ダイアログを閉じることができます。

ApacheOpenOfficeの共有ディレクトリ

具体的なApache OpenOfficeインストールのすべてのユーザーを通して共有されるスクリプトは、共有ディレクトリに保存できます。ApacheOpenOfficeに付属するすべてのデフォルト・スクリプトは、ここにあります。一般には、このディレクトリは、スクリプトの展開には使用しないでください(後のuno-packagesを参照)。

スクリプト・ファイルは、ファイル・システム内に保存されるだけです。(ユーザー・ディレクトリのような)ディレクトリの場所は、使用するOpenOffice.orgのバージョンとオペレーティング・システムによって異なります。いくつかの例は、次のとおりです。:

OpenOffice 2.x

  • windows C:\Program Files\OpenOffice.org 2.0\share\Scripts\python
  • unix /usr/lib/openoffice/share/Scripts/python

OpenOffice 3.x

  • windows 7/64Bit C:\Program Files (x86)\OpenOffice.org 3\Basis\share\Scripts\python'
  • ubuntu 10.04 /usr/lib/openoffice/basis3.2/share/Scripts/python

Apache OpenOfficeの文書に埋め込む

OpenOffice.org文書は、異なるファイルが含まれているzipファイルです。文書内のPythonスクリプトは、Scripts/pythonサブディレクトリに格納されています。

あなたが、自分で書いたPythonスクリプトを文書内に送りたい場合、まず、あなたは、(上記の)ユーザー・ディレクトリーで、スクリプトを開発する必要があります。続いて、最後に、お気に入りのzipツールでスクリプトを文書に移動します。しかしながら、以前に行ったすべての結合を文書内のスクリプト・インスタンスに再割り当てする必要があることに注意してください。理想的には、あなたは、スクリプトをユーザー・ディレクトリから移動します。そして、文書の機能に対して回帰テストを実行します。

スクリプト・ファイルを文書に移動した後、(太字で印刷された)いくつかの行をMETA-INF /manifest.xmlファイルに追加する必要があります。:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
 <manifest:file-entry manifest:media-type="application/vnd.oasis.opendocument.text" manifest:full-path="/"/>
 <manifest:file-entry manifest:media-type="application/vnd.sun.xml.ui.configuration" manifest:full-path="Configurations2/"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Pictures/"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="content.xml"/>
 <manifest:file-entry :media-type="text/xml" manifest:full-path="styles.xml"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="meta.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/thumbnail.png"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Thumbnails/"/>
 <manifest:file-entry manifest:media-type="text/xml" manifest:full-path="settings.xml"/>
 <manifest:file-entry manifest:media-type="" manifest:full-path="Scripts/python/push_me.py"/>
 <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/python/"/>
 <manifest:file-entry manifest:media-type="application/binary" manifest:full-path="Scripts/"/>
</manifest:manifest>

あなたが、後で文書を開くとき、Apache OpenOfficeのUIは、ドキュメント内のスクリプト・コンテンツについて警告する必要があります。(そうでないとき、あなたは、オプションの警告をオフにしたか、何か間違ったことをしました)。

例:どのように機能するかを確認するには、File:Push me python4.odtをダウンロードしてください。文書には、押しボタンと複数行の編集コントロールが含まれています。ボタンを押すと、現在のタイムスタンプを持つ新しい行が、複数行の編集コントロールに追加されます。

Apache OpenOfficeのユーザー・ディレクトリ(読取り専用)に、uno-パッケージ内に埋め込む(読み取り専用)

多くの場合(たとえば、アプリケーション自体を変更する場合、または複数の文書で同じスクリプトを使用する場合)、文書でスクリプトを配布することは、あなたが望むものでありません。。したがって、あなたは、スクリプトを、単純にuno-パッケージ内に配置できます。

uno-パッケージは、zipファイルです。その名前は、.pkgで終わる必要があります。そうでなければ、それは、動作しません。あなたが、サブディレクトリ(必須!)を定義する必要のあるファイルは、スクリプトが含まれる必要があります。たとえば、サンプルpyhello2.uno.pkgは、次のファイル構造を持っています。:

META-INF/
META-INF/manifest.xml
package/
package/hallo.py

hallo.pyには、スクリプトが含まれています。どのようにスクリプトを記述するかは、下で説明します。しかしながら、unoパッケージ内で、スクリプトを機能させるために、あなたは、いくつかのダミー・コードを追加する必要があります。

# ... here is the python script code
# ... ここに、pythonスクリプト・コードがあります。
 
# this must be added to every script file (the
# name org.openoffice.script.DummyImplementationForPythonScripts should be changed to something
# different (must be unique within an office installation !)

# これは、あらゆるスクリプト・ファイル(名前org.openoffice.script.DummyImplementationForPythonScripts)
# に追加する必要があり、別のものに変更する必要があります。
# (オフィスのインストール内で一意である必要があります!)

# --- faked component, dummy to allow registration with unopkg, no functionality expected
# --- 偽のコンポーネント、unopkgでの登録を可能にするダミー、機能は期待されていません
import unohelper
g_ImplementationHelper = unohelper.ImplementationHelper()
g_ImplementationHelper.addImplementation( \
    None,"org.openoffice.script.DummyImplementationForPythonScripts", \
    ("org.openoffice.script.DummyServiceForPythonScripts",),)

デフォルトでは、すべての.pyファイルは、UNOコンポーネントとして解釈されます。.pyファイル内に上記の行がないと、展開中にエラーが発生します。

ディレクトリ名(ここではパッケージ)は、自由に選択できます。pythonスクリプトが含まれているuno-packageには、自由に選択されたディレクトリ名を指すMETA-INF /manifest.xmlが含まれている必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE manifest:manifest PUBLIC "-//OpenOffice.org//DTD Manifest 1.0//EN" "Manifest.dtd">
<manifest:manifest xmlns:manifest="http://openoffice.org/2001/manifest">
<manifest:file-entry manifest:media-type="application/vnd.sun.star.framework-script" manifest:full-path="package"/>
</manifest:manifest>

すべてのユーザーは、パッケージ・マネージャー(ツール/拡張機能マネージャー)を介してパッケージを追加できます。パッケージ内のコンテンツは、設計上読み取り専用であり、実際には純粋なデプロイメントであり、開発メカニズムではないことに注意してください。これが、パッケージ内のスクリプトを[ツール] / [マクロ] / [マクロの整理] / [Python]ダイアログで表示できない理由である可能性があります。Apache OpenOfficeのshareディレクトリ(読み取り専用)のuno-パッケージ内に埋め込まれていますパッケージは、管理者で、ApacheOpenOfficeの完全なインストールに追加できます。そのため、すべてのユーザーは、パッケージ内にあるマクロの実行を使用できます。これは、unopkgツールを使用して実行できます。

スクリプト・コーディング

Script coding

Apache OpenOfficeのスクリプト・フレームワーク内のPythonスクリプトは、(defキーワードによって導入される).pyファイル内の関数です。[ツール] / [マクロ] / [マクロの実行]ダイアログで実行するには、スクリプトに空の引数リストが必要です。一般的なイベント・リスナーの場合、関数には1つの引数(イベント)が必要です。一般には、引数の数は、関数が使用されるコンテキストによって異なります。現在では、.pyファイルは、将来変更されるunixラインフィードを使用する必要があります。

1つの.pyファイルには、任意の数の関数定義を含めることができます。デフォルトでは、すべての関数定義が、エクスポートされます(=マクロ選択ダイアログに表示されます)。これは面倒になる可能性があるため、関数定義のタプルのg_exportedScriptsという名前のグローバル変数を持つことによって、エクスポートは、より小さな関数群に制限できます。

現在の統合レベルでは、.pyファイルは、pythonのPYTHONPATH内にあるpythonモジュールをインポートできるだけです。デフォルトでは、これは、標準ライブラリとunoブリッジ・ファイルを備えたpythonランタイムです。これは、pythonマクロが、他のpythonマクロ・ファイルを参照できないことを示しています。この制限は、将来変更される可能性がありますが、現在、存在しています。pythonマクロは、できます。もちろん、あなたが、PYTHONPATHに配置したモジュールからインポートします。;ただし、あなたは、それを自分で行う必要があり、結果は持ち運べません。

(読者は、疑問に思います:pythonloaderは、Apache OpenOfficeスクリプト・ディレクトリをPYTHONPATHに自動的に追加できませんでしたか?)

モジュール内のソースコードを実行する前に、グローバル変数XSCRIPTCONTEXTは、3つのメンバー(Document、Desktop、ComponentContext)を持っているモジュール内にグローバル変数として挿入されます。(この変数も存在し、たとえば、javascriptとbeanshellの場合、一貫性の理由からここで提供されます)。

関数のコメント(3つの "で導入および終了)は、マクロの選択ダイアログに説明として表示されます。

コンパイルされたpythonスクリプト・ファイルは、sys.modulesに追加されません。同じモジュールの複数のインスタンスが、同時に存在する場合があります。例:

# HelloWorld python script for the scripting framework
 # スクリプト・フレームワーク用のHelloWorld pythonスクリプト
def HelloWorldPython( ):
    """Prints the string 'Hello World(in Python)' into the current document"""
    # 文字列 'Hello World(in Python)'を現在の文書に出力します
    #get the doc from the scripting context which is made available to all scripts
    # すべてのスクリプトで利用できるようになっているスクリプト・コンテキストから文書を取得します
    model = XSCRIPTCONTEXT.getDocument()
    text = model.Text
    cursor = text.createTextCursor()
    text.insertString( cursor, "Hello World(in Python)", 0 )

エラー処理とデバッグ

Error handling and debugging

スクリプトのコンパイル、あるいは、実行中のエラーは、可能な場合は、例外としてスクリプト・フレームワークに渡されます。スクリプト・フレームワークは、通常、ポップアップ・ボックスを開き、投げられた例外のメッセージを表示します。

しかしながら、これが不可能な場合があり、エラーは黙って無視されます。ユーザーは、次の場合に、これらのエラーに気付きます。

  • 彼のpythonスクリプト・ファイルは、期待される場所に表示されません
  • スクリプト・ファイルの名前が表示されますが、それは、どんなスクリプトも含まれていません。
  • スクリプトの一部だけが実行されます。

あなたは、OpenOffice.org 3/Basis/program/pythonscript.pyファイルのいくつかのフラグを変更することで、これらの問題を知ることができます。:

# Configuration ----------------------------------------------------
# 構成
LogLevel.use = LogLevel.NONE                # alternavly use LogLevel.ERROR or LogLevel.DEBUG
                                            # 代わりに、LogLevel.ERROR、あるいは、LogLevel.DEBUGを使用します
LOG_STDOUT = False                          # True, writes to stdout
                                            # True、stdoutに書き込みます
                                            # False, writes to user/Scripts/python/log.txt
                                            # False、user/Scripts/python/log.txtに書き込みます
ENABLE_EDIT_DIALOG=False                    # offers a minimal editor for editing.
                                            # 編集用の最小限のエディターを提供します。

pythonデバッガの接続は、現在サポートされていません。

クレジット

Credits

スクリプト用フレームワークのpython結合は、Joerg Budischewskiが空き時間に開発および保守しています。SunのTomasO'Connorの多大なサポートと、この結合を可能にしたフレームワークへのコードの追加に感謝します。api@openoffice.apache.orgに、結合に関する低レベルの質問をしてください。

このエントリーをはてなブックマークに追加