Linux環境でIDL Python Bridgeを使用してPython3系を起動する際に、思うように動作しない場合の確認事項
IDLとPythonは相互に連携することができる。この機能はIDL Python Bridgeと呼ばれ、Pythonの様々なライブラリをIDLからも利用できる点で非常に便利な機能である。
しかしながら、Linux環境でこの機能を使用する場合、公式のHELP記事に従ったパスなどの設定を実施しても、以下のような問題が発生することがある。
- HELP記事に従ってPython3系のパス設定をしたが、なぜかPython2系が起動する
- 端末にはNumpyなどのライブラリがインストールされているにもかかわらず、IDLから起動したPythonでそのライブラリが見つからないといったエラーメッセージが出力される
この場合の確認事項についてこの記事では紹介する。
Pythonオブジェクトの生成までの処理フロー
IDLからPythonの機能を呼び出す際に、IDLでは以下のような動作を行っている
- Pythonオブジェクトの生成が宣言された際、IDLセッションがすでに端末にインストールされているPythonのバージョンに関連したdllファイルまたはsoファイルをロードしているかを内部で確認する
- まだロードが行われていない場合、
python --version
コマンドの実行結果を取得する
- この結果を参照し、端末にインストールされているPythonのバージョンを特定する
- 特定したバージョンに対応するdllファイルまたはsoファイルをロードする
この2.の操作で実行されているコマンドに注目する。実際にターミナルを起動し、このコマンドを実行した際に起動されるPythonは、ユーザがIDL内で使用したいものと一致していない可能性がある。
- RHEL7系では、
/usr/bin/python
のシンボリックリンクがデフォルトで設定されており、これはPython2.x に対して貼られている
- RHEL8系やUbuntu20系およびそのフレーバーでは、
/usr/bin/python
がデフォルトで定義されていない
以下、それぞれのOSでの回避策について記載する。
RHEL7系の場合の回避策
RHEL7系の場合には、yumなどのOSの基本的なプログラムが内部で /usr/bin/python
を参照している。これは以下のように実行することでも確認できる。
cat /usr/bin/yum | grep python
そして、デフォルトの/usr/bin/python
はシステムデフォルトのPython2系に対して設定されたシンボリックリンクであるため、これをPython3系に切り替えるとyumが動作しなくなるなどの問題が発生する。
この問題を回避するには、IDL内で実行されているpython --version
というコマンドを別のものに変更する必要がある。以下、手順を説明する。
- ターミナルから
python3
と実行した際に起動するPythonが目的のものとなっていることを確認する。そうでない場合、 コマンドを別のシンボリックリンクに切り替える。
- IDL Python Bridge機能のソースファイルのバックアップを取得する
- viなどのエディタでソースファイル
python__define.pro
を開き編集する
- IDLを起動し、意図したPythonがインポートされることを確認する
RHEL8系、またはUbuntu20系およびそのフレーバーの場合の回避策
RHEL8系やUbuntu20系およびそのフレーバーの場合には、デフォルトで/usr/bin/python
が定義されておらず、pythonコマンド自体が解決できない。そのため、このケースでは python コマンドを実行した際に意図したPythonが起動する設定となっていれば良い。
- シンボリックリンクを作成するか、あるいは、alternativesによってpythonコマンドで目的のPythonが起動する設定を施す
- IDLを起動し、意図したPythonがインポートされることを確認する
なお、もしpythonコマンドを実施した際にPython2系が起動することを意図したアプリケーションなどが同一端末上に存在する場合には、RHEL7系の場合の回避策で示した方法でpython3 --version
が実行されるようにソースファイルに変更を加えることでこれを回避する。