Closed y-masutani closed 3 years ago
自己フォローです.
試している環境のPythonのバージョンは3.8ですが,Python37\Lib\sre_parse.py
を C:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32
にコピーしたところ,ビルドが通るようになりました.
インストーラの不備ということでしょうか?
@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
そうですか… 関係ないと思いますが,私の環境はPython 3.8.3,Visual Studio 2019です.
@n-kawauchi 様の環境では,どこのsre-parse.pyが使われているのでしょうか?
omniidlの実行時にsre-parse.py は無くても正常に動いたのでインストーラには含めておりません。 こちらでもPython3.8.3 + Visual Studio 2019 の環境で確認してみましたが、独自IDLを持つRTCのビルドは問題なく通りました。 コマンドラインでのomniidl実行も問題なしです。
ただし、確認したテスト環境はバージョン違いのVisual Studio, Pythonを複数インストールしており、それぞれ切り替えて実行しました。 Pythonは3.8以外のパスは通しておりません。 現時点でエラーの原因は見当がつかない状況です。申し訳ございません。
C:\Program Files\OpenRTM-aist\1.2.2\omniORB\4.2.4_vc14\bin\x86_win32
の中にある,re.py
と sre_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'>
でした.
こちらでも、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の動作確認方法に不備があり、スクリプトの抜けに気づけなかったと思えます。 ご迷惑をおかけいたしました。
細かいことですが,
この環境で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へコピーする」が正しい対処法ではないかと思います.
お手数をおかけしております。
「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も同様の仕様となってしまいました。 よろしくお願いいたします。
この不具合は OpenRTM-aist 2.0.0 で対応します。修正対象は omniORB のマージモジュール作成スクリプトになります。 このソースはsubversionで管理しているため、修正については下記Redmineチケットで報告します。 https://openrtm.org/redmine/issues/4772
上記チケットにこのIssueもリンクしましたので、本Issueはcloseとします。
Windows上でバージョン1.2.2で独自idlを使ったRTCをビルドする際に,hhファイルが生成されずにエラーになります.コマンドプロンプトを起動し,build\idlに移動して,Visual Studioの中で実行されているomniidlのコマンドを入力すると,以下のようなエラーが出ています.
全く同じコードのRTCのビルドをバージョン1.2.1の環境で試しましたが,エラーは起こりません.何の問題でしょうか?解決方法をご教示いただけると幸いです.よろしくお願いいたします.
Windows 10 64bitにおいてOpenRTM-aist-1.2.2-RELEASE_x86_64.msiでインストールしたものを使っています.