Home > コンピュータ > LibreOffice > マクロ > Python > ドキュメント > Pythonアプリケーションの設計と開発

Pythonアプリケーションの設計と開発 [LibreOffice Wikiの和訳]

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

このページの内容は、LibreOffice Wiki 「PDesigning & Developing Python Applications」 の和訳です。。

翻訳時の翻訳元のページの最終更新日時は 2021-10-13 19:11:11 です。

また、部分的に翻訳されている日本語 Wikiページ「マクロ/Python設計ガイド」も存在します


序文

Introduction

このページは、LibreOfficeアプリケーションの設計や共同作業を希望するPythonマクロ開発者を対象としています。初心者から経験豊富なPythonコーダーまで、このページの開発ガイドラインから恩恵を得られるかもしれません。LibreOffice内のPythonを見つけるために、Pythonプログラマーズ・ガイド(英語ページ「Macros/Python Guide」)から始めてください。

LibreOfficeプロジェクトに参加したい方は、こちらのWiki「参加しよう」を参照してください。

このページは、あなたが、LibreOfficeアプリケーション・スイートをある程度使い慣れてるのと同じように、Pythonに相応に向き合っていると仮定しています。簡単に説明されたLibreOffice拡張機能の使用法と同じように、いくつかのPythonコード・サンプルが含まれています。

ドキュメント

統一モデリング言語(UML)

Unified Modeling Language (UML)

多数のUML駆動型ツールが、利用できます。注目の言語に言及した、無料のオープンソースの相互運用可能なアプリケーションに焦点を当てた勝手なリストを紹介します。

  • ArgoUML :ArgoUMLは、どんなJavaプラットホーム上でも動作し、10の言語(アメリカ英語、イギリス英語、フランス語、ドイツ語、イタリア語、ポルトガル語、スペイン語、ロシア語、ノルウェーの文語と中国語)で利用できます。
  • StarUML :StarUMLは、macOS 10.6以上、Windows XP以上、Ubuntu (64、あるいは、32bit)向けに提供されています。StarUMLは、豊富な機能を備えていますが、英語版のみ提供されています。
  • Umbrello :多言語対応のUmbrelloは、GNU / Linuxディストリビューション、Windows(64、あるいは、32bit)、およびmacOSに対応しています。

統一モデリング言語(UML)ツールの広範囲なリストは、Wikipediaから利用できます。

StarOfficeプログラマーのチュートリアルでは、UML図を使用してLibreOffice文書について詳しく説明しています。

ソフトウェアのデザイン・パターンは、Wikipediaで説明されており、Pythonの例が付随している場合もあります。

序文

Preamble

LibreOfficeのBasic言語のマクロ開発には、Basicマクロが、編集、デバッグなどができる統合開発環境(IDE)が付属しています。Pythonマクロを作成するには、あなたが選択したIDEを構築するための追加の構築段階が必要です。その見返りとして、あなたは、Pythonの開発の好みや習慣に基づいて構築された柔軟な設計経験が提供されます。以下に、初心者から上級ユーザーのためのIDEの設定の案内があります。

Basicと同等のライブラリとマクロの取り扱いは、Pythonでは使用できません。しかしながら、Pythonの伝統的なモジュールと関数を管理することは、確かにできます。一方、Pythonパッケージの構築は、どうにかして、部分的に、LibreOffice拡張機能やUNOパッケージを作成するために変換されます。このページは、同じ意味で、マクロのためのライブラリと関数のためにモジュールを使用します。Pythonの用語は、Pythonの文化的な使用法にうまく対応するために、好まれる場合があります。

LibreOfficeのスクリプトには、personal、shared、あるいは、文書に埋め込むことができる3つの異なる特色があります。それらの種類と依存するプラットホームに応じて、それらは、AOO wikiの「マクロ言語としてのPython」の記事で説明されている、さまざまな場所に保存されることになります。

Pythonスクリプトを管理するには、Windowsライブラリを使用するか、GNU/Linuxファイルマネージャのショートカットを使用します。このように、.pyファイルは、カジュアルなドラッグ&ドロップを使用して整理できます。あなたのライブラリやファイル・マネージャのショートカットの設定を助けるためのあなたの環境に応じたフォルダの場所の説明は、AOOのwiki記事「マクロ言語としてのPython」で見つけることができます。

図で示すように、Pythonプロジェクトは、以降のWindowsライブラリのIDEごとに配置できます。

必須のAlternative Python Script Organizer拡張機能(ASPO)は、Pythonスクリプト管理に影響を及ぼします。あなたは、LibreOfficeをインストールすることで、Pythonスクリプトをより強力に統合できます。一旦、LibreOfficeが再開されると、マクロのツール・メニューを確認します。-Pythonスクリプト・サブメニューを整理します。

この拡張機能は、Pythonスクリプトを管理するためのさまざまな動作を提案します。実行ボタンは、選択したマクロを実行します。Menuボタンから入手可能な動作は、選択した要素に依存します。:

  • あなたが、personal、shared、文書コンテナを選択するたびに、マクロやライブラリを作成します。
  • マクロやライブラリを編集、名前の変更、削除
  • 個人用や共有コンテナから文書にマクロを埋め込む
  • 文書に埋め込まれたライブラリを、プラットフォームのPythonモジュールに置き換えます。
  • 文書に埋め込まれたライブラリをPythonモジュールとしてエクスポートします。
  • 選択されたマクロをデバッグする
  • Pythonインタプリタとしても知られるPythonインタラクティブ・コンソールを実行する

スクリプトの編成とPythonパッケージに関連するその他の情報は、デバッグで見つけることができます。

LibreOfficeのスクリプトは、LibreOfficeアプリケーション・スイートでスクリプトを、どのように使用するかを詳しく説明します。

開発する

Developing

多くのアプリケーションは、元のまま、あるいは、特別化してPythonを利用しています。LibreOfficeには、Universal Network Objects (UNO)を通じて、APIを使用できる独自のPythonインタープリタが組み込まれています。Python言語は、独自のインタプリタを持っており、LibreOfficeと並行して使用できます。どちらも共通の基盤を共有し、拡張可能であり、同じ機能を提供するだけでなく、異なる機能も提供します。ネイティブのPythonには、LibreOffice APIへのUNOインターフェイスが含まれていません。逆に、LibreOfficeは、ネイティブPythonとしては、完全には、動作せず、ネイティブPythonとして、まったく同じように、機能を拡張するわけではありません。しかしながら、LibreOfficeも、ネイティブPythonも、Writer、Calc、Impress、Draw、Base、Math用のPython言語で、アプリケーションの開発を容易にしません。

LibreOfficeは、32や64bit版が存在します。付随する統合開発環境(IDE)は、32、あるいは、64bitの両方は、同じコンテキストで実行する必要があります。IDLEのような最も簡単なものから、議論の余地はありますが、より精巧なPyCharmEclipseのためのPyDevのようなものまで、多数のIDEが存在します。

次のリストは、無料のオープンソース、マルチプラットフォーム、場合によってはマルチ言語のツールを、思いつくままに焦点を当てています。以下のデバッグの章では、説明のためだけにPyzoとPyCharmを使用しています。PythonのためのIDEのリストは、Python.orgサイトから入手できます。多数の言語の統合開発環境の比較IDE)は、Wikipediaから入手できます。

  • 統合開発、および学習環境(IDLE)は、32と64bitをサポートしています。それは、多くのプラットフォームで利用できます。IDLEは、Pythonを学ぶための推奨ツールです。
  • Geanyは、32や64bitで動作します。そして、43の異なる言語で利用できます。GNU / Linux、* BSD、macOS、AIX v5.3、Solaris Express、Windowsで動作します。Geanyは、軽量で、小さなプロジェクトに適合し、LibreOffice Pythonインタプリタをサポートしています。
  • Liclipse
  • Aptanaを使用したデバッグは可能なようです。 このスレッドを参照してください。
  • PyCharm(無料版)は、Gnu / Linux、macOS、Windowsプラットフォームをサポートしています。32bitとして利用でき、64bitにも対応しているようです。Python開発に伴う多数の機能に加えて、PyCharmは、LibreOfficeと互換性のあるPythonデバッガーを持っています。
  • Pyzoは、Linux、OS X、Windowsで、10の異なる言語で利用できます。32bitや64bitの複数のPythonインタプリタを構成できます。Pyzoは、デバッギング機能を提供します。

これらのIDEから利用できる機能のリストを次に示します。LibreOfficeBasicIDEは、それらの一部を提供していません。

ソース・エクスプローラ、構文の強調表示

IDLE、Geany、PyCharm内でのソース探索と構文の強調表示により、スクリプトの編集が容易になります。GeanyとPyCharmは、コードの折り畳みをサポートしています。IDLEクラス・ブラウザは、内部、あるいは、埋め込みクラスをサポートしていません。

IDLE - 構文の強調表示とクラス・ブラウザ。

IDLE - 構文の強調表示とクラス・ブラウザ。

Geany - クラス・エクスプローラ、構文の強調表示とコードの折り畳み。

Geany - クラス・エクスプローラ、構文の強調表示とコードの折り畳み。

PyCharm - コードの色分け、コード・エクスプローラとクラス分析。

PyCharm - コードの色分け、コード・エクスプローラとクラス分析。

コード補完

Code completion

コード補完は、IDLE、Geany、PyCharmでのPythonスクリプトの編集を支援します。

IDLE - モジュール補完

IDLE - モジュール補完

IDLE - 関数補完

IDLE - 関数補完

Geany - クラス・メソッド補完

Geany - クラス・メソッド補完

PyCharm - コード補完

PyCharm - コード補完

デバッグ

Debugging

以下のデバッグの章では、このテーマについて詳しく説明します。

Geanyは、SDKで定義された..awt.createMessageBox()APIメソッドを呼び出すinfo()関数を実行します-スクリプト名は、<user>\SysInfo.pyです。

Geanyは、SDKで定義された..awt.createMessageBox()APIメソッドを呼び出すinfo()関数を実行します-スクリプト名は、<user>\SysInfo.pyです。

Pyzoは、実行され、\..\IDE_utils.pyで、停止します。

Pyzoは、実行され、<user>\..\IDE_utils.pyで、停止します。

UNOオブジェクトのUNO、Pythonクラス、変数の監視

UNOオブジェクトのUNO、Pythonクラス、変数の監視

APSOを使用したブレークポイント、スタックトレース、オブジェクトの検査

APSOを使用したブレークポイント、スタックトレース、オブジェクトの検査

コーディング・ガイドライン(PEP)

Coding guidelines (PEP)

PyCharm IDEは、Python拡張の提案(PEP)コンプライアンス・チェックを表示します。

PyCharm IDEは、Python拡張の提案(PEP)コンプライアンス・チェックを表示します。

Pythonのコーディング規則と推奨事項は、エディターの右端にあります。これは、経験の浅いプログラマーにとって特に便利です。

テスト駆動開発(TDD)-草案

Test-Driven Development (TDD) - draft

</Unit testing>

バージョン管理

Version Control

下で図示するように、ソースコードのローカル履歴には、PyCharmが付属しています。:

下で図示するように、ソースコードのローカル履歴には、PyCharmが付属しています。:

apso.py Pythonモジュールの2つのコピーが一緒に表示され、それぞれv0.8.3とv0.8.7のラベルが付いています。バージョンの違いは、正確に強調表示されます。

PyCharmは、Git、GitHub、Mercurial、Perforce、Subversionなどの他のバージョン管理ソリューション(VCS)をサポートしています。

デバッグ

Debugging

LibreOfficeの内部

Within LibreOffice

Alternative Python Script Organizer拡張機能を使用して、LibreOffice内で、Pythonマクロを直接編集およびデバッグできます。LibreOfficeを離れることなく、ライブラリとモジュールを管理したり、好みのエディタを選択したりすることができます。

LibreOfficeからの開発も同様に実行可能であるため、デバッグが可能になります。統合開発環境(IDE)を使用したリモートコーディングとテストにより、この後詳述されるより多くの特徴を持っています。

ここに、これらの2つのコンテキストで、恩恵を受けるために、プログラマーのための3つの拡張機能があります。LibreOffice Basic、Python、JavaScript、BeanShellなど、プログラミング言語に関係なく使用できます。3つすべてが、LibreOfficeスイートからAPIイントロスペクションを拡張します。

役に立つ拡張

Useful Extensions

設計時に、UNOオブジェクトが、実際にサポートするサービスが、常に明確であるとは限りません。しかしながら、開発者が、どんなUNOオブジェクトでも、検査するのに役立つ拡張機能が存在しますが、MRIを除いて、拡張機能のカタログからは利用できません。それらは、LibreOfficeのAPIリフレクション機能に基づいて構築されています。

  • X-Rayは、LibreOfficeのAPIオブジェクトを検査します。オブジェクト変数によって提供されるプロパティ、メソッド、サービス、インターフェイスが表示されます。X-Rayは、フランス語、英語、ドイツ語、スペイン語、チェコ語、ポーランド語、ロシア語で利用できます。X-Rayは、Basicで記述されています。
  • MRI(My Reflection and Introspection)は、Pythonで記述されたUNOオブジェクトのイントロスペクションツールです。その機能は、X-Rayの機能と似ています。MRIは、英語だけで利用できます。注:拡張機能のカタログMRIコピーは古くなっています。
  • Object Inspectorオブジェクト・インスペクタ拡張機能は、すべてのサポートされたサービス、エクスポートされたインターフェイス、およびTreeViewウィンドウ内のそれぞれのメソッドとプロパティのような、UNOオブジェクトの全機能を表示します。オブジェクト・インスペクタは、Javaで記述され、英語だけで利用できます。
  • APSOAlternate Python Script Organizer 拡張機能は、オブジェクト・インスペクタをデバッガーにうまく統合します。X-RayまたはMRIのいずれかを使用します。

Xray - Writerテキスト・オブジェクトのメソッド

Xray - Writerテキスト・オブジェクトのメソッド

MRI - Writer文書のためのプロパティ、メソッド、サービス、インターフェイス

MRI - Writer文書のためのプロパティ、メソッド、サービス、インターフェイス

Object Inspector - 「StarDesktop」のプロパティ、メソッド、サポートされているサービス、およびエクスポートされたインターフェイス

Object Inspector - 「StarDesktop」のプロパティ、メソッド、サポートされているサービス、およびエクスポートされたインターフェイス

Pythonマクロの使用

Usage of Python macros

LibreOfficeのPythonマクロは、さまざまな場所に保存されており、「マクロ言語としてのPython」で説明されているように、さまざまな種類があります。スクリプトは、personal、shared、拡張機能への保存、パッケージへの統合、文書への埋め込みが可能です。この多様性は、さまざまな用途や制約を暗示します。

文書では、それぞれのモジュールは自律的であり、モジュールのインポートはありません。これを回避するために、オンライン/ローカル・ヘルプの「Pythonのインポート」を参照してください。

埋め込まれたPythonモジュールから、BasicやPython拡張機能を呼び出すことができます。

<user>\python\pythonpath内のPythonスクリプトは、埋め込みモジュール、または<user>\pythonスクリプトによってインポートできます。IDEからのBasicのサポートなし:X-Rayが存在しない

Basicの存在は、IDEで設置されたブリッジの種類に依存しています。

PythonとJavaは、IDEから呼び出されたときにサポートされます。:MRI、オブジェクト・インスペクタを使用することができます。

ここに、Pythonマクロで、Mriを、どのように使用するかがあります。:

import uno
def mri(target):
    ctx = uno.getComponentContext()
    mri = ctx.ServiceManager.createInstanceWithContext(
        "mytools.Mri",ctx)
    mri.inspect(target)
    
if __name__ == '__main__':
    def Mri_test():
        document = XSCRIPTCONTEXT.getDocument()
        mri(document)
 
    Mri_test()

X-Rayで、実行中のマクロを停止する:

import uno
from com.sun.star.uno import RuntimeException as _rtex

def xray(myObject):
  try:
    sm = uno.getComponentContext().ServiceManager
    mspf = sm.createInstanceWithContext(&quot;com.sun.star.script.provider.MasterScriptProviderFactory&quot;, uno.getComponentContext())
    scriptPro = mspf.createScriptProvider(&quot;&quot;)
    xScript = scriptPro.getScript(&quot;vnd.sun.star.script:XrayTool._Main.Xray?language=Basic&amp;location=application&quot;)
    xScript.invoke((myObject,), (), ())
    return
  except:
     raise _rtex(&quot;\nBasic library Xray is not installed&quot;, uno.getComponentContext())

# ___________  example of use  _______________ 

def demoXray(): 
  &quot;&quot;&quot; example : using xray in a Writer document &quot;&quot;&quot; 
  
  xTextDoc = XSCRIPTCONTEXT.getDocument() 
  xText = xTextDoc.Text 
  xray(xText)
  xray(&quot;Demo is finished&quot;) 

g_exportedScripts = demoXray,

オブジェクト・インスペクタを使用して、UNOオブジェクトをツリービューに表示する:

import uno
def inspectObject( obj, title="Object Inspector" ):
	ctx = uno.getComponentContext()
	oi = ctx.ServiceManager.createInstanceWithContext("org.openoffice.InstanceInspector", ctx)
	if oi is None:  # i.e. InstanceInspector is not installed or deactivated
			# すなわち、インスタンス・インスペクタが、インストール、あるいは、非アクティブ化されていません
		return  # exit silently
			# 静かに終了します
	oi.inspect( obj, title )
def exObjInspector():
	doc = XSCRIPTCONTEXT.getDocument()
	dsk = XSCRIPTCONTEXT.getDesktop()
	inspectObject(doc)
	inspectObject(dsk, title="StarDesktop")

IDEから、LibreOffice Pythonインタプリタを経由する

From an IDE via LibreOffice Python interpreter

IDE内でPythonマクロを開発するには、LibreOfficeインタプリタを使用する必要があります。ネイティブPythonには、UNOオブジェクトと互換性のないIDLEのインタプリタが付属しています。Python IDEを選択していると、プログラマーは、クラス・ブラウザ、構文の強調表示、コードの補間、コーディング標準の適用、テスト駆動開発、デバッグ、バージョン管理などの多くの機能を利用できます。

Geany、PyCharm、Pyzo用のLibreOffice Pythonインタプリタの設定は、「マクロ/Pythonの基礎」で説明されています。

Geany - Project Properties - Base Path

Geany - Project Properties - Base Path

Geany - Project Properties - Build - Execute Commands

Geany - Project Properties - Build - Execute Commands

Pyzo - Shell - Shell configurations...

Pyzo - Shell - Shell configurations...

PyCharm - Default Settings - Project Interpreter

PyCharm - Default Settings - Project Interpreter

<user>\python、あるいは、<user>\python\pythonpathからスクリプトを実行するには、IDEとLibreOfficeの間で、通信を確立する必要があります。このようなブリッジがないと、UNOオブジェクトに到達できません。一旦、通信が行われると、IDEとLibreOfficeは、連携して動作します。次のリンクは、そのプロセスを文書化しています。:

IDE_utilsモジュールは、これらのリソースを借りて、LibreOfficeのIDE用のPythonマクロの単純な有効化を提供します。

Pythonスクリプトの使用法

Usage of Python scripts

  • … Pythonパッケージと呼ばれています …

Geanyによる外部実行

External Execution with Geany

Geanyは、LibreOffice内で、ウィンドウを開き始めます。GeanyのEDIは、SDKで定義された..awt.createMessageBoxAPIメソッドを利用するinfo()関数を呼び出します。ユーザー・スクリプトには、SysInfo.pyという名前が付いています。

Geanyによる外部実行

PyZoによるデバッグ

Debugging with PyZo

PyUNOのWorkspaceは、PyUNOとLibreOffice UNO APIのためのオブジェクトのイントロスペクションPyzo IDEプラグインです:

PyZoによるデバッグ

Pyzoは、実行され、\..\IDE_utils.pyで、停止します。

APSOによるデバッグ

Debugging with APSO

Alternative Python Script Organizer拡張機能は、xRayやMRIによるスタックトレース表示とUNOオブジェクトのイントロスペクションと同じように、段階的に実行できます。

APSOによるデバッグ

コンソールへの出力

Output to Consoles

Pythonスクリプトは、PythonシェルとそのRead Execute Print Loop(REPL)プロセスを使用して、プロトタイプ化できます。Alternative Python Script Organizerは、LibreOffice Pythonの一部であるこの機能を統合します。

Pythonインタラクティブ・コンソール

Python Interactive Console

PythonインタプリタやPythonシェルとも呼ばれるPythonインタラクティブ・コンソールは、プログラマーに、コマンドを素早く実行し、ファイルを作成せずに、コードを試してテストする方法を提供します。LibreOfficeDev Pythonモジュール文書と同じように、UNOオブジェクトのイントロスペクションは、ターミナルから取得できます。オンライン/ローカルのLibreOfficeでは、Pythonインタラクティブ・コンソールを、どのように実行するかについて詳しく説明しています。

Windowsのコンソール

Console on Windows

デフォルトでは、Windowsには、デフォルトのstdoutはありません。関数 "print" によって送信されたものは、どこにも表示されません。コンソールをstdoutとして使用するには:

  • soffice.exeの代わりにsoffice.comを使用してLibreOfficeを起動します。:

LibreOfficeが閉じるまで、Pythonスクリプトのprint()ステートメントは、コンソールに表示されます。コンソールが、存在しなければ、print()ステートメントは、何もしません。

ソース:Windows上のLibreOfficeの適切なコンソールモード

これは、LibreOfficeリリース 6.3から利用できます。このリリースの前では、次の手順に従ってください。:

  • LibreOfficeを閉じます。
  • Visual Studio Express 2010 C++を、ダウンロードする。(私は、それが、他のバージョンでも動作する可能性があると思います)そして、それをインストールします。
  • Visual Studioのためのコンソールを開きます。
  • 次の内容を力する:
editbin.exe /subsystem:console "C:\Program Files\LibreOffice 5\program\soffice.exe"
editbin.exe /subsystem:console "C:\Program Files\LibreOffice 5\program\soffice.bin"

cf. TechNetでのEditBinリファレンス

次に、あなたが、LibreOfficeを開くとき、コンソールが表示されます。それは、"print"コマンドのためのstdoutです。そして、あなたが、トレースバックを使用する場合、LOが実行されている間、Pythonエラーを取得する可能性があります。

import traceback
[…]
try:
    […]
    except:
        traceback.print_exc()

しかし、構文エラーは、まだ報告されません。

ソース:[Python]エラー報告-デバッグ構成

例外の処理-草案

Handling Exceptions - draft

例外の処理-草案

Handling Exceptions - draft

ダイアログの構築-草案

Building Dialogs - draft

UNODiT UNOダイアログ・ツールは、下にリストされている参考資料をいくつか紹介します。:

ダイアログを設計する

Designing Dialogs

イベント駆動マクロ

ローカライゼーション

Localisation

ディスパッチャ・コマンド-草案

Dispatcher commands - draft

*Officeによるインターフェイス指向プログラミング、Christopher Bourez(2015)

拡張機能の作成-草案

Creating extensions - draft

拡張機能

拡張機能開発

拡張機能マネージャー

UNOコンポーネントのパッケージ化 - Pythonコンポーネントのテスト

ダイアログ・コントロールによって作成されたイベントを受け取る

サービスを構築する

Building a Service

Calcアドインを構築する

Building a Calc Add-In

構築と拡張

Building and Extension

その他-草案

Miscellaneous - draft

文書モジュールのインポート

Document module import

参考:オンラインヘルプでのPythonモジュールのインポート

Pythonパッケージ vs. LibreOffice拡張機能

Python package vs. LibreOffice Extension

(参考:これまでのフランス語の草案バージョン)

静的プロパティやメソッド

Static Properties or Methods

Q: Pythonのグローバル属性の動作は、どのようなものですか?

PyCharmで、Gitを使用する ― 草案 ―

Using Git with PyCharm - draft

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