バグ #1499
完了Python用のコード生成で使用されるomniORBpyのバージョン
100%
説明
サービスポートを持つRTCのPython用のコード生成を行う場合、_GlobalIDL/__init__.py、_GlobalIDL__POA/__init__.pyの記述内容がomniORBpy-2系用になっている。
以下は、_GlobalIDL/__init__.pyの内容
# DO NOT EDIT THIS FILE! # # Python module _GlobalIDL generated by omniidl # ** 1. Stub files contributing to this module import MyService_idl # ** 2. Sub-modules # ** 3. End
自分の環境(omniORBpy-3.4)にて再度同じIDLファイルをomniidlにてIDLコンパイルした場合は、__init__.pyは下記のようになる。
# DO NOT EDIT THIS FILE! # # Python module _GlobalIDL__POA generated by omniidl import omniORB omniORB.updateModule("_GlobalIDL__POA") # ** 1. Stub files contributing to this module import MyService_idl # ** 2. Sub-modules # ** 3. End
(RTCBにて生成時に、omniORBpy-2.7のidlコンパイラが使用されている???)
omniORBpy-2系の__init__.pyでは、"MyService_idl"だけをimportするのに対し、omniORBpy-3系の__init__.pyでは、"omniORB.updateModule("_GlobalIDL__POA")というのが追加されているため、omniORBpy-3系がインストールされている環境では、RTCBで生成されたコードを実行するとエラーとなる。
[環境] OS: WindowsXP Eclipse: 3.4.2 Java: 1.6.0_17 RTSE,RTCB: dailybuild r114
kurihara さんが14年以上前に更新
omniORB.updateModule()が必要かどうかは、RTCを実行する環境のomniORBpyのバージョンに依存します。
omniORBpy-2系(2.7等)の場合、omniORB.updateModule()があると実行時にエラーになりますし、
逆に、omniORBpy-3系(3.0,3.1,3.4等)の場合は、omniORB.updateModule()がなければ実行時エラーとなります。
なお、_GlobalIDL__POAというキーワードについては、IDLコンパイルを行う対象のIDLファイル内で、module名が例えば、SimpleServiceと定義されている場合は、SimpleService,SimpleService__POAとなりますし、moduleが定義されていなければ_GlobalIDL,_GlobalIDL__POAとなります。
また、_GlobalIDL,_GlobalIDL_POAというフォルダも作成されておりますが、これも、モジュールが定義されている場合は、SimpleService,SimpleService__POAというフォルダが作成される必要があります。