ConoHa Wingに最新のPythonをインストール

概要

  • ConoHa WingでpythonのWebアプリ(flask)を公開しようと思いました。2024年1月現在、ConoHa Wingにインストールされているpythonは3.6.11となっており、古くなっているので最新の3.11をインストールしようと思います。
  • ConoHa Wingの利用者に管理者権限は割り当てられておらず、yum等のパッケージマネージャを使用できません。そのため、ここでは、ソースコードからpythonをビルド(コンパイル)する前提の手順を紹介します。
  • 当初、開発環境(Windows10)のpythonバージョンを3.6に合わせて開発しようと思いました。しかしながら、最新のVSCode(Python 拡張機能)でのデバッグでは、3.7以上が必要なので、3.6を使用するのは諦めました。(Python 拡張機能のバージョンを下げれば問題ないようです。)

前提

  • ConoHa Wingの既存の実行環境は次の通りです。
    (OSはCloud Linuxを使用しています。)
  • 次のパッケージを使用します。
    • python3.11で使用するlibffi, opensslに関して、既存環境のものは古いので、pythonと併せて最新のものをインストールします。
    • なお、これらがなくても機能を制限してpythonをインストールすることもできます。しかしながら、ここでは後でflaskの使用を考えているので、必須の手順としています。
    No.パッケージ理由
    1Python(3.11.7)python本体です。
    2openssl(3.2.0)ハッシュや暗号化処理のために使用します。
    (python3.10からOpenSSL1.1.1以上が必要。)
    3libffi(3.4.4)OpenSSL等のC言語のライブラリを呼び出すために使用します。
  • 管理者権限がなく、パッケージマネージャの利用も困難なので、次の前提の手順にしています。
    • 各パッケージは、ソースコード(.tgz)からビルド・インストールします。
    • ビルドのためのパッケージの展開先は、ホームディレクトリ直下のwork(~/work)とします。
    • パッケージのインストール先は、ホームディレクトリ直下のlocalディレクトリ($HOME/local)とします。

インストール手順

使用するディレクトリ、パッケージのバージョンなどは、ご所望の環境に応じて適宜変更してください。
$HOME~/と同じパスを示しています。

libffiのインストール

インストール先として$HOME/localを指定し、ビルド・インストールします。

opensslのインストール

インストール先として$HOME/localを指定し、ビルド・インストールします。

pythonのインストール

インストール先として$HOME/localを指定し、ビルド・インストールします。
python3, pip3という名称でインストールされるので、python, pipで実行できるようシンボリックリンクを作成します。

  • configureでは、pythonのインストール先を指定します。(--prefix $HOME/local
  • 前述の手順でインストールしたlibffi, opensslのライブラリやインクルードファイルを参照できるよう、リンカーオプション(LDFLAGS)、コンパイラオプション(CPPFLAGS)を指定します。
  • make実行時に”Following modules built successfully but were removed because they could not be imported”という警告が出力されます。これを回避するために、環境変数LD_LIBRARY_PATH(コマンド実行時にライブラリを探索するパス)を宣言しています。詳細は参考をご覧ください。
  • configureにて--with-openssl等のSSLオプションを指定していません。リンカーオプション(LDFLAGS)で適切なOpenSSLライブラリを参照できれば、自動的にSSL(pythonのssl系モジュール)が有効になるようです。
  • configureで有効になったpythonモジュールは、config.logで確認できます。

動作確認

pythonコマンドが実行可能なこと、バージョンが3.11になっていることを確認します。
利用可能なモジュールとして、_ctypes, _sslが表示されることを確認します。

その他の設定

pythonコマンドが正しいライブラリを参照できるようLD_LIBRARY_PATHを追加します。
また、インストールしたpython, pipコマンドを使用できるようパスを変更します。

参考

ネットに情報がほとんどなかったので独自に解決しました。

ffi.hが見つからないエラー

  • pythonのmake実行時に次の警告が出力されます。
  • C言語ライブラリを呼び出すためのライブラリctypesをビルドする際に、libffiが提供するこのヘッダファイルが必要になるようです。
  • 既存環境では見つけられなかったので、libffiをインストールします。(ここでは~/localにインストールする想定なので、当該ヘッダファイルは~/local/includeに配置されます。)
  • コンパイル時にこのヘッダファイルを見つけられるよう、configureオプションにCPPFLAGS="-I $HOME/local/include"を指定します。
  • なお、_hashlib, _sslモジュールのエラーも併せて出力されますが、ctypesの問題解後に解消されました。(_hashlib, _sslはctypesを使用してOpenSSLのC言語ライブラリを参照しており、ctypesのエラーでOpeneSSLを参照できずにエラーになっていると思われます。)

共有ライブラリが見つからないエラー

  • pythonのmake実行時に次の警告が出力されます。
  • “built successfully”と出力されているのでビルドは成功しているようですが、ビルドしたpythonコマンドの実行に失敗していると考えました。(コンパイル時は、LDFLAGSオプションを指定することでlibffi, opensselライブラリを参照できているが、ビルドしたpythonを単体で実行するとそれらのライブラリを参照できず、”cannot open shared object”になっている。)
  • pythonコマンド実行時に新しいlibffi, opensslライブラリを見つけられるよう、環境変数LD_LIBRARY_PATHを宣言します。(LD_LIBRARY_PATH="$HOME/local/lib64"