LibreOffice5(18)拡張機能python-tokencounter-calc-addin.oxtをリモートデバッグする

2016-01-01

旧ブログ

t f B! P L

前の関連記事:LibreOffice5(17)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その2


LibreOffice5(10)Calcに関数を追加するPython拡張機能の例その1で使ったCalcに関数を追加する拡張機能python-tokencounter-calc-addin.oxtをリモートデバッグしてみます。linuxBean14.04(93)Eclipse4.5にPyDevをインストールの設定をした状態で行います。

拡張機能の例python-tokencounter-calc-addin.oxtをPyDevプロジェクトに取り込む


Python-UNO bridgeからpython-tokencounter-calc-addin.oxtをダウンロードします。

EclipseのパースペクティブをPyDevにします。

PyDev Package ExplorerでlinuxBean14.04(93)Eclipse4.5にPyDevをインストールで作ったLibreOffice5.0プロジェクトを右クリック→New→Source Folder。



ProjectにはすでにLibreoffice5.0が入っているのでNameにtokencounterを入力してFinishボタンをクリック。(一般的にはソースフォルダ名はsrcとすることが多いようです。)

PyDev Package Explorerで新しくできたtokencounterフォルダを右クリック→Import。


GneralフォルダのArchive Fileを選択して「Next」。


oxtファイルを作りなおすのに全てのファイルが必要なのでSelect Allボタンをクリックしてpyファイル以外もすべてプロジェクトフォルダに取り込むようにします。

「Finish」ボタンをクリック。

これで~/workspace/LibreOffice5.0/tokencounterフォルダにpython-tokencounter-calc-addin.oxtの中身が展開されて取り込まれました。

tokencounter.pyを編集してリモートデバッガを呼び出すコードを挿入する


python-tokencounter-calc-addin.oxtのPythonソースファイルであるtokencounter.pyはpythonpathフォルダの階層の最下層にあります。


まずLibreOffice5(14)Calcに関数を追加するPython拡張機能の例その2でみつけた間違いを訂正します。

tokencounter.pyの38行目のgetDisplayArgumentNameをgetDisplayCategoryNameに訂正しました。
    def getDisplayCategoryName( self, aProgrammaticFunctionName ):
        return "Add-In"

    def tokencount( self, str ):
        import pydevd; pydevd.settrace()
        # certainly not the most efficient way to implement ...
        return len( str.split() )
42行目にリモートデバッガと接続するコードを挿入しました。

tokencounter.pyファイルを上書き保存します。

デバッグコードを挿入した拡張機能をLibreOfficeにデプロイする


~/workspace/LibreOffice5.0/tokencounterフォルダをファイルマネージャで開きます。

そこにあるファイル全て選択して右クリック→ファイルを圧縮する。


zipを選択して「作成」ボタンをクリック。

できたtokencounter.zipファイルをpython-tokencounter-calc-addin.oxtに改名します。

Calcを起動してツール→拡張機能マネージャー。

「追加」ボタンでpython-tokencounter-calc-addin.oxtを登録してCalcを再起動します。

PyDevのデバッグサーバを起動する


EclipseのDebugパースペクティブに切り替えます。

Eclipseのメニュー、Pydev→Start Debug Server。

これでPyDevのデバッグサーバが起動します。

Calcでtokencounter.pyを起動してEclipseでデバッグする


Calcを起動してA1セルに適当な文字列を入力します。


セルに=tokeまで入力するとTOKENCOUNT()がポップアップ表示されてきます。

この状態でEnterキーを押すとポップアップの内容を入力してくれます。


引数にするセルA1を選択してEnterキーを押すとそこでCalcの動作が止まります。


Eclipseに切り替えるとtokencounter.pyの44行目で止まって、Variablesタブにはstrの値が表示されています。

あとはステップオーバーすると次行に進みます。

今回の例では1行でプログラムは終わってしまいますけど。

デバッグサーバを起動する前にCalcでTOKENCOUNT関数を使ってしまうともうデバッグサーバに接続されませんでした。

そのときはCalcを再起動する必要があります。

デバッグサーバを起動していない時はデバッグコードを挿入する前と同じ動作をしました。

関数の動作が途中で止まってしまうようなことがありましたが、一定の条件で再現できませんでした。

開発が終了したらデバッグコードは削除したほうがよいでしょう。

(2016.2.24追記。今回はPyDevプロジェクトに取り込んだソースをコピーしたものをLibreOfficeの拡張機能マネージャーに登録することでリモートデバッグできましたが、LibreOffice5(26)MRI - UNO Object Inspection Tool:その2で同じやり方をMRIにしようと思ったらうまくいきませんでした。またデバッグコードを埋め込んだままだと拡張機能が動かなくなりました。LibreOffice5(28)MRI - UNO Object Inspection Tool:その4参照。)

参考にしたサイト


Python-UNO bridge
拡張機能python-tokencounter-calc-addin.oxtをリモートデバッグしました。

次の関連記事:LibreOffice5(19)イベント駆動する拡張機能のJavaの例:AsyncJob.oxt その3

ブログ検索 by Blogger

Translate

最近のコメント

Created by Calendar Gadget

QooQ