507 Rate this article:
No rating

Linux環境でIDL Python Bridgeを使用してPython3系を起動する際に、思うように動作しない場合の確認事項

IDLとPythonは相互に連携することができる。この機能はIDL Python Bridgeと呼ばれ、Pythonの様々なライブラリをIDLからも利用できる点で非常に便利な機能である。

しかしながら、Linux環境でこの機能を使用する場合、公式のHELP記事に従ったパスなどの設定を実施しても、以下のような問題が発生することがある。

 

  • HELP記事に従ってPython3系のパス設定をしたが、なぜかPython2系が起動する
  • 端末にはNumpyなどのライブラリがインストールされているにもかかわらず、IDLから起動したPythonでそのライブラリが見つからないといったエラーメッセージが出力される

 

 

この場合の確認事項についてこの記事では紹介する。

 

 

Pythonオブジェクトの生成までの処理フロー

 

IDLからPythonの機能を呼び出す際に、IDLでは以下のような動作を行っている

 

  1. Pythonオブジェクトの生成が宣言された際、IDLセッションがすでに端末にインストールされているPythonのバージョンに関連したdllファイルまたはsoファイルをロードしているかを内部で確認する
  2. まだロードが行われていない場合、python --versionコマンドの実行結果を取得する
  3. この結果を参照し、端末にインストールされているPythonのバージョンを特定する
  4. 特定したバージョンに対応する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というコマンドを別のものに変更する必要がある。以下、手順を説明する。

 

  1. ターミナルから python3と実行した際に起動するPythonが目的のものとなっていることを確認する。そうでない場合、 コマンドを別のシンボリックリンクに切り替える。

  2. IDL Python Bridge機能のソースファイルのバックアップを取得する

  3. viなどのエディタでソースファイルpython__define.proを開き編集する

  4. IDLを起動し、意図したPythonがインポートされることを確認する


  5.  

 

 

RHEL8系、またはUbuntu20系およびそのフレーバーの場合の回避策

 

RHEL8系やUbuntu20系およびそのフレーバーの場合には、デフォルトで/usr/bin/pythonが定義されておらず、pythonコマンド自体が解決できない。そのため、このケースでは python コマンドを実行した際に意図したPythonが起動する設定となっていれば良い。

  1. シンボリックリンクを作成するか、あるいは、alternativesによってpythonコマンドで目的のPythonが起動する設定を施す

  2. IDLを起動し、意図したPythonがインポートされることを確認する


  3.  

なお、もしpythonコマンドを実施した際にPython2系が起動することを意図したアプリケーションなどが同一端末上に存在する場合には、RHEL7系の場合の回避策で示した方法でpython3 --versionが実行されるようにソースファイルに変更を加えることでこれを回避する。