LibreOffice のマクロ実行環境に nfcpy をインストールする

この間作った「FeliCa カード読み込み」プログラムを LibreOffice のマクロにしてみようと思ったんだけど(OpenOffice.org や、その流れをくむ LibreOffice は、マクロ言語として Python や JavaScript が使える)、とりあえず実行してみると、

Python のスクリプト vnd.sun.star.script:nfc_macro_test.py$GetCardData?language=Python&location=share の実行中に Scripting Framework エラーが発生しました。

メッセージ: <class 'ImportError'>: No module named 'nfc'
<以下略>

とエラーになる。カードリーダーを制御するためのモジュールが読み込めないようだ。

LibreOffice はマクロ実行に、Windows にインストールされている Python ではなく、自前で用意した C:\Program Files\LibreOffice\program\python-core-3.5.7\bin\python.exe を使用する。そのため、モジュール類もこの Python 用にインストールする必要がある。

Python環境としてのLibreOfficeをより便利に使うために (2018-03-23)」というサイトを参考にインストールを行った。

1.まず、パッケージ管理ソフト pip のインストーラ(get-pip.py)をダウンロード

https://pip.pypa.io/en/stable/installing/ では、UNIX 系 OS 用に curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py で手に入れろと書いてあるが、Windows に curl コマンドはないので、直接ブラウザに https://bootstrap.pypa.io/get-pip.py を打って入手。
あとでコマンドを実行するディレクトリに置く。

2.get-pip.py を実行し、pip をインストールする。

俺は、get-pip.py を C:\Users\shinoda\Source\Python の下に置き、そのディレクトリに cd してからコマンド実行。

C:\Users\shinoda\Source\Python>set PATH=C:\Program Files\LibreOffice\program;%PATH%
C:\Users\shinoda\Source\Python>python get-pip.py --user

これで pip がインストールされる。

C:\Users\shinoda\AppData\Roaming\Python\Python35\Scripts ディレクトリ以下を見れば、pip.exe、pip3.5.exe、pip3.exe がインストールされている(全部同じもの)。
これで、外部モジュールをインストールする準備はできた。

3.pip で nfcpy をインストールする

C:\Users\shinoda\AppData\Roaming\Python\Python35\Scripts ディレクトリ以下にインストールされた pip を使うために path を通してから実行。

C:\Users\shinoda\Source\Python>set PATH=C:\Users\shinoda\AppData\Roaming\Python\Python35\Scripts;%PATH%
C:\Users\shinoda\Source\Python>pip install --user nfcpy

これでインストールされる。

4.パッケージ(fcpy や libusb1)が正常に入ったか確認

C:\Users\shinoda\Source\Python>pip list
Package    Version
---------- -------
libusb1    1.7.1
ndeflib    0.3.3
nfcpy      1.0.3
pip        19.2.2
pyDes      2.0.1
pyserial   3.4
setuptools 41.2.0
wheel      0.33.6

バッチリですな。

一旦 LibreOffice を閉じて、もう一度開き直してマクロ実行。これでも、No module named 'nfc' なエラーは出なくなる。

ま、新たに、

com.sun.star.uno.RuntimeException: Couldn't convert SONY RC-S380/P on usb:003:008 to a UNO type; caught exception: <class 'AttributeError'>: 'ContactlessFrontend' object has no attribute 'getTypes', traceback follows
no traceback available
 (Error during invoking function GetCardData in module file:///C:/Program%20Files/LibreOffice/share/Scripts/python/nfc_macro_test.py (<class 'uno.com.sun.star.uno.RuntimeException'>: Couldn't convert SONY RC-S380/P on usb:003:008 to a UNO type; caught exception: <class 'AttributeError'>: 'ContactlessFrontend' object has no attribute 'getTypes', traceback follows
no traceback available

  File "C:\Program Files\LibreOffice\program\pythonscript.py", line 907, in invoke
    ret = self.func( *args )
  File "C:\Program Files\LibreOffice\share\Scripts\python\nfc_macro_test.py", line 17, in GetCardData
    cell.String = clf
))

なんてエラーが出ちゃうんだけど(^^;

マクロで外部のデバイス(SONY RC-S380 カードリーダ)を制御出来んのかな?
ちょっと別の方法を考えるか・・・

Python のプログラム側から LibreOffice API を叩く方が良さげ。

<追記>
結局、エラーメッセージのとおり、ContactlessFrontend オブジェクトをそのままセルにぶち込もうとしたためのエラーだった。別エントリーで書いているように、String型に変換してセルに入れればまったく問題なかった(^^;

トラックバック(0)

このブログ記事を参照しているブログ一覧: LibreOffice のマクロ実行環境に nfcpy をインストールする

このブログ記事に対するトラックバックURL: https://blog.netandfield.com/mt/mt-tb.cgi/5412

コメントする

このブログ記事について

このページは、shinodaが2019年8月24日 15:54に書いたブログ記事です。

ひとつ前のブログ記事は「七輪のSAMURAI、割と気に入った」です。

次のブログ記事は「LibreOffice の Python で外部スクリプトを実行してみる」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

電気ウナギ的○○ mobile ver.

携帯版「電気ウナギ的○○」はこちら