この間作った「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 listPackage Version---------- -------libusb1 1.7.1ndeflib 0.3.3nfcpy 1.0.3
pip 19.2.2
pyDes 2.0.1pyserial 3.4setuptools 41.2.0wheel 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 followsno 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 followsno traceback availableFile "C:\Program Files\LibreOffice\program\pythonscript.py", line 907, in invokeret = self.func( *args )File "C:\Program Files\LibreOffice\share\Scripts\python\nfc_macro_test.py", line 17, in GetCardDatacell.String = clf))
なんてエラーが出ちゃうんだけど(^^;
マクロで外部のデバイス(SONY RC-S380 カードリーダ)を制御出来んのかな?
ちょっと別の方法を考えるか・・・
Python のプログラム側から LibreOffice API を叩く方が良さげ。
<追記>
結局、エラーメッセージのとおり、ContactlessFrontend オブジェクトをそのままセルにぶち込もうとしたためのエラーだった。別エントリーで書いているように、String型に変換してセルに入れればまったく問題なかった(^^;
コメントする