OpenRTM / OpenRTM-aist

OpenRTM-aist: RT-Middleware and OMG RTC implementation in C++ implemented by AIST
https://openrtm.org/
Other
19 stars 12 forks source link

Windows版バージョン1.2.2でomniidlのエラー #930

Closed y-masutani closed 3 years ago

y-masutani commented 3 years ago

Windows上でバージョン1.2.2で独自idlを使ったRTCをビルドする際に,hhファイルが生成されずにエラーになります.コマンドプロンプトを起動し,build\idlに移動して,Visual Studioの中で実行されているomniidlのコマンドを入力すると,以下のようなエラーが出ています.

>where omniidl
C:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32\omniidl.exe

>omniidl -bcxx -Wba -nf -Wbshortcut "-IC:/Program Files/OpenRTM-aist/1.2.2/rtm/idl" C:/xxxxx/yyyyy/idl/zzzzz.idl
omniidl: Could not import back-end 'cxx'
omniidl: Maybe you need to use the -p option?
omniidl: (The error was 'No module named 'sre_parse'')

全く同じコードのRTCのビルドをバージョン1.2.1の環境で試しましたが,エラーは起こりません.何の問題でしょうか?解決方法をご教示いただけると幸いです.よろしくお願いいたします.

Windows 10 64bitにおいてOpenRTM-aist-1.2.2-RELEASE_x86_64.msiでインストールしたものを使っています.

y-masutani commented 3 years ago

自己フォローです. 試している環境のPythonのバージョンは3.8ですが,Python37\Lib\sre_parse.pyC:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32 にコピーしたところ,ビルドが通るようになりました. インストーラの不備ということでしょうか?

n-kawauchi commented 3 years ago

@y-masutani 先生、私の環境で独自IDLのデータポートを持つRTCをvc2015でビルドしたところ問題なく通ります。

>python --version
Python 3.8.5
(インストール先は、C:\Python38\python.exe)

>where omniidl
C:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32\omniidl.exe

コマンドでomniidlの動作確認のため、idlファイルだけを用意して実行してもエラーは発生しません。 インストーラmsiでインストールした環境のままで、変更はしておりません。

>ls
test.idl

>omniidl -bcxx -Wba -nf -Wbshortcut -I "%RTM_ROOT%/rtm/idl" test.idl
>ls
test.hh  test.idl  testDynSK.cc  testSK.cc
y-masutani commented 3 years ago

そうですか… 関係ないと思いますが,私の環境はPython 3.8.3,Visual Studio 2019です.

@n-kawauchi 様の環境では,どこのsre-parse.pyが使われているのでしょうか?

n-kawauchi commented 3 years ago

omniidlの実行時にsre-parse.py は無くても正常に動いたのでインストーラには含めておりません。 こちらでもPython3.8.3 + Visual Studio 2019 の環境で確認してみましたが、独自IDLを持つRTCのビルドは問題なく通りました。 コマンドラインでのomniidl実行も問題なしです。 

ただし、確認したテスト環境はバージョン違いのVisual Studio, Pythonを複数インストールしており、それぞれ切り替えて実行しました。 Pythonは3.8以外のパスは通しておりません。 現時点でエラーの原因は見当がつかない状況です。申し訳ございません。

y-masutani commented 3 years ago

C:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32 の中にある,re.pysre_compile.py の中で

import sre_parse

していますが,このsre_parseはどこから読まれているのでしょうか?

適切なやり方かわかりませんが,Python3.7の環境から,python.exeをこのディレクトリにコピーして実行し,import sre_parse して print(sre_parse) するとどうなりますか?私の環境では,このディレクトリにsre_parse.pyがないと,

>>> import sre_parse
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ModuleNotFoundError: No module named 'sre_parse'
>>> print(sre_parse)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'sre_parse' is not defined

あると,

>>> import sre_parse
>>> print(sre_parse)
<module 'sre_parse' from 'C:\\Program Files\\OpenRTM-aist\\1.2.2\\omniORB\\4.2.4_vc14\\bin\\x86_win32\\sre_parse.py'>

でした.

n-kawauchi commented 3 years ago

こちらでも、Pythonは3.8だけをインストールしている環境(vc2019)で同じビルドエラーを確認できました。 ご指摘の通り、インストーラに Python3.7用のsre_parse.py が含まれていないことが原因です。 「C:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32」へPython3.7のsre_parse.pyをコピーしたらビルドが通りました。

WindowsへPythonをインストールすると、Pythonランチャー(py.exe)も一緒にインストールされるため、システム環境変数のPATHに登録しなくてもPythonのインストール場所は見つかるようになっているのですね。 Python3.6、3.7、3.8をインストールしていて、PATHにはPython3.8のパスだけを追加している環境でPythonのインストール先を確認してみました。

>py --list-paths
Installed Pythons found by py Launcher for Windows
 -3.8-64        C:\Python38\python.exe *
 -3.7-64        C:\Program Files\Python37\python.exe
 -3.6-64        C:\Program Files\Python36\python.exe

この環境でomniidlの実行は正常に通ります。sre_parseはPython3.8のものを見つけているのにです。

>python
Python 3.8.3
>>> import sre_parse
>>> print(sre_parse)
<module 'sre_parse' from 'C:\\Python38\\lib\\sre_parse.py'>

ですので、Pythonランチャーで見つけた3.7のパスからsre_parseを見つけているように思えます。

OpenRTM-aist1.2.1の環境ではエラーにならなかったとのことですが、このomniidlはPython2.7環境でビルドしていて、 インストーラにsre_parse.pyを含めていました。

1.2.2のomniidlはPython3.7環境でビルドしています。omniidlの動作確認方法に不備があり、スクリプトの抜けに気づけなかったと思えます。 ご迷惑をおかけいたしました。

y-masutani commented 3 years ago

細かいことですが,

この環境でomniidlの実行は正常に通ります。sre_parseはPython3.8のものを見つけているのにです。

OpenRTM-aist-1.2.2のmsiでインストールしたC:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32に Python3.8のsre_parse.pyをコピーして,omniidlを実行すると,

AttributeError: 'SubPattern' object has no attribute 'pattern'

というエラーが起こります.sre_parseの仕様が変更されているようです.

OpenRTM-aist1.2.1の環境ではエラーにならなかったとのことですが、このomniidlはPython2.7環境でビルドしていて、 インストーラにsre_parse.pyを含めていました。

OpenRTM-aist-1.2.1のmsiでインストールしたC:\Program Files\OpenRTM-aist\1.2.1\omniORB\4.2.3_vc14\bin\x86_win32 には,sre_parse.pyは含まれていません.私の環境では,C:\python37\Lib\sre_parse.pyが読まれているようです.また,python37.dllが含まれていますので,Python3.7でビルドしたものではないでしょうか?

ということで,「Python3.7のsre_parse.pyをx86_win32へコピーする」が正しい対処法ではないかと思います.

n-kawauchi commented 3 years ago

お手数をおかけしております。

「Python3.7のsre_parse.pyをx86_win32へコピーする」が正しい対処法ではないかと思います.

はい、その通りです。 ご指摘のようにPython3.7もインストールされている環境の場合、Python3.7ディレクトリ下のsre_parse.py が読まれるためエラーになりません。

omniORBをPython2.7でビルドしていたのはOpenRTM-aist 1.2.0まででした。1.2.1以降はPython3.7でビルドしております。1.2.1の時にこの不具合に気づけなかったため1.2.2も同様の仕様となってしまいました。 よろしくお願いいたします。

n-kawauchi commented 3 years ago

この不具合は OpenRTM-aist 2.0.0 で対応します。修正対象は omniORB のマージモジュール作成スクリプトになります。 このソースはsubversionで管理しているため、修正については下記Redmineチケットで報告します。 https://openrtm.org/redmine/issues/4772

上記チケットにこのIssueもリンクしましたので、本Issueはcloseとします。