LibreOffice5(26)MRI - UNO Object Inspection Tool:その2

2016-02-12

旧ブログ

t f B! P L

前の関連記事:LibreOffice5(25)MRI - UNO Object Inspection Tool:その1


MRIのソースはPythonですのでソースを読んでいろいろ学習します。

MRIにUNOオブジェクトを渡す


RunMRI_ja · hanya/MRI Wiki · GitHubに解説があります。

linuxBean14.04(88)LibreOffice5をIPython Notebookから操作するで設定したIPython Notebookでやります。

ソケット通信の状態で起動してWriterを起動したLibreOfficeに接続します。
In [1]:
import unopy
XSCRIPTCONTEXT = unopy.connect()
if not XSCRIPTCONTEXT:
    print("Failed to connect.")
    import sys
    sys.exit(0)
MRIをインスタンス化するのに必要なコンポーネントコンテクストを得ます。
In [2]:
ctx = XSCRIPTCONTEXT.getComponentContext()
MRIにコンポーネントコンテクストを渡してインスタンス化します。
In [3]:
mri = ctx.getServiceManager().createInstanceWithContext("mytools.Mri", ctx)
開いているWriterドキュメントを得ます。
In [4]:
doc = XSCRIPTCONTEXT.getDocument()
このdocをMRIでインスペクトします。
In [5]:
mri.inspect(doc)
これでMRIのウィンドウが起動してLibreOffice5(25)MRI - UNO Object Inspection Tool:その1でメニューからツール→アドオン→MRI、とやったのと同じ結果が得られました。
In [6]:
ctx.getServiceManager().createInstanceWithArgumentsAndContext("mytools.Mri",(doc,), ctx)
Out[6]:
pyuno object (com.sun.star.uno.XInterface)0x8b1094c{implementationName=mytools.Mri, supportedServices={mytools.Mri}, supportedInterfaces={com.sun.star.lang.XTypeProvider,com.sun.star.task.XJobExecutor,com.sun.star.lang.XServiceInfo,com.sun.star.beans.XIntrospection}}
createInstanceWithArgumentsAndContext()メソッドでUNOオブジェクトを引数にしてもMRIを起動できます。
MRIは同時に複数のウィンドウを起動でき2つ目のウィンドウタイトルは「MRI-2」となっていました。
In [7]:
import unoinsp
ins = unoinsp.ObjInsp(XSCRIPTCONTEXT)
mri自体の属性ツリーをLibreOffice5(24)unoinsp.py:出力を抑制するインターフェイスの指定方法を追加のunoinsp.pyで出力してみます。
In [8]:
ins.itree(mri, ["core"])

pyuno object
├─mytools.Mri
│   └─.beans.XIntrospection
│         │   .beans.XIntrospectionAccess  inspect( [in] any aObject)
│         └─.uno.XInterface
│                     void  acquire()
│                      any  queryInterface( [in] type aType)
│                     void  release()
├─.lang.XServiceInfo
│           string  getImplementationName()
│         [string]  getSupportedServiceNames()
│          boolean  supportsService( [in] string ServiceName)
├─.lang.XTypeProvider
│         [byte]  getImplementationId()
│         [type]  getTypes()
└─.task.XJobExecutor
            void  trigger( [in] string Event)
In [9]:
mri.inspect(mri)

これはMRIのウィンドウをキャプチャした画像を貼り付けたのであってIPython Notebookのセルには出力されたものではありません。

MRIと同じ結果が得られたと思いますが、RuntimeExceptionがunoinsp.pyの方に出力されていませんね。

MRI自体をリモートデバッガに接続することはできず


(2016.2.22追記。拡張機能のキャッシュをソースにしてPyDevプロジェクトを作成したらリモートデバッガに接続できました。LibreOffice5(28)MRI - UNO Object Inspection Tool:その4参照。)

linuxBean14.04(93)Eclipse4.5にPyDevをインストールと同様にしてEclipseのPyDevプラグインを使ってMRIをリモートデバッガに接続しようとしましたが結論としてはうまくできませんでした。

これはインスペクタとは関係なく単に私のPythonのお勉強のためにだけにやるものです。

まずはMRIのソースにデバッグコードを埋め込みます。

LibreOffice5(25)MRI - UNO Object Inspection Tool:その1でダウンロードしたMRI-1.3.1.oxtファイルのファイル名の後ろに.zipを追加します。

右クリック→指定先にファイルを展開。

MRI-1.3.1.oxtという名前のフォルダを作成してそこに展開します。

展開したファイルのMRI.pyをGeanyで開きます。
def create(ctx, *args):
    import pydevd; pydevd.settrace()
    try:
        import mytools_Mri.component
        return mytools_Mri.component.create(IMPLE_NAME, ctx, *args)
    except Exception as e:
        print(e)
create()関数にデバッグコードを埋めました。

MRI.pyを保存して、MRI-1.3.1.oxtフォルダ内のファイルをすべて選択した状態で右クリック→ファイルを圧縮する。

MRI-1.3.1.oxt.zipファイルが同じフォルダ内にできるので、これをMRI-1.3.1.oxtに名前を変えて完成です。

これをLibreOfficeの拡張機能マネージャーに登録します。

まず先にインストールしてあるMRI-1.3.1.oxtを削除しておきます。

拡張機能マネージャーで作業するたびにLibreOfficeの再起動が必要です。

ところがこれだと19行目のインデントがどうこうと言われて拡張機能マネージャーに登録できません。

20行目のtry文の中に入れると今度はエラーすらでず拡張機能マネージャーが固まりました。

うーん。拡張機能マネージャーに登録する段階でデバッガを呼び出すのが問題なのでしょうか、、、

linuxBean14.04(93)Eclipse4.5にPyDevをインストールでやったときはデバッグコードは動作に支障を来さないと思ったのですが違うようです。

仕方ないのでpythonpath/mytools_Mri/component.pyのcreate()関数にデバッグコードを埋め込むことにしました。
def create(imple_name, ctx, *args):
    import pydevd; pydevd.settrace()
    global IMPLE_NAME
    if IMPLE_NAME is None:
        IMPLE_NAME = imple_name
    return Mri(ctx, *args)
今度は問題なく拡張機能マネージャーに登録できました。

ところが今度はMRIが動きません。(再度やってみると今度は登録すらできません。)

うーん、component.pyのMriクラスのtrigger()メソッドの中にデバッグコードを入れても同じ結果です。

ところがこの状態でもIPython Notebookから起動、つまりオートメーションではMRIは動作します。

うーん、そのあとも_run_mri()メソッドに入れたり試行錯誤しましたが症状も一定せずオートメーションで動いたとしてもデバッガに接続できませんでしたので諦めました。

linuxBean14.04(100)Anaconda3のpy335にpylintとpycallgraphをインストールし直すのpyreverseでクラス図を出すだけでもしようとしましたが、これもモジュールごとにしかクラス図ができずうまくいきませんでした。
source activate py335
pyreverse -o png -p MRI ~/.config/libreoffice/4/user/uno_packages/cache/uno_packages/lu23990jqbzfe.tmp_/MRI-1.3.1.oxt/pythonpath/mytools_Mri/__init__.py
仕方ないのでソースを読むだけにします。

__init__pyファイルにいっぱいコードが書いてあるし、同じ名前のクラスもでてくるので理解には時間がかかりそうです。

(2016.2.14追記。PyCharmからオートメーションで逐次実行できました。LibreOffice5(27)MRI - UNO Object Inspection Tool:その3参照。)

参考にしたサイト


Home_ja · hanya/MRI Wiki · GitHub
MRIの解説。

次の関連記事:LibreOffice5(27)MRI - UNO Object Inspection Tool:その3

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ