coreserver v2のレンタルサーバで、pythonとflaskの組み合わせでWEBシステムを公開していたが、pythonライブラリをインストールをするときなどに、_ctypesのエラーが発生した時、対処に相当苦労しましたが、何とかエラーを回避することが出来たので、皆さんの参考になればと思い対処方法を紹介いたします。
発生したエラー
pythonライブラリをpipでインストールする時やimportでライブラリを読み込んだ時に以下のメッセージで実行が出来ないことがあります。
ModuleNotFoundError: No module named '_ctypes'
対処の方法は「libffi」が存在していない状態でpythonをインストールしたことが原因であることが多く、レンタルサーバでなければ、「libffi」をインストールした後にpython環境をもう一度インストールすれば解決するようです。
参考記事:https://qiita.com/s2hap/items/f8a1a90b99efef4a08a3
しかしながら、レンタルサーバではインストールする権限が無いため一苦労しなければいけません。まずは「libffi」準備しなければなりません
「libffi」のインストールまでの準備
単純にyumコマンド等でインストールすることが出来ないので以下のように手作業でインストールを進めていきました。
まず、最初にレンタルサーバで作業をするために、HOMEフォルダに作業フォルダを作成
mkdir -p ~/work/libffi
公開されている「libffi」を作成した作業フォルダにダウンロードします。
cd work/libffi
wget ftp://sourceware.org/pub/libffi/libffi-3.2.1.tar.gz
正常にダウンロードが出来たなら、解凍しておきます。
tar xvfz libffi-3.2.1.tar.gz
「libffi」のインストール
libffiのファイルが準備できたので、それでは解凍したフォルダに移動してインストールを実施していきます。今回は、$HOME/.local/libffi/3_2_1にインストールしてきますが、自身の環境に合わせてフォルダを指定してください
cd libffi-3.2.1
./configure --prefix=$HOME/.local/libffi/3_2_1
スクリプトが実行されインストール環境に問題が無ければ次に進みます。次はコンパイルとインストールです。
make
make install
問題なくコンパイル&インストールが終わると、$HOME/.local/libffi/3_2_1にインストールが完了しています。
libffiを利用できるように設定
通常、yum等でインストールした場合、以下のような設定は必要ありませんが。レンタルサーバ等では利用できないため、インストールしたファイルを利用できるように設定作業を行います。
まず、バージョンに依存しないようにシンボリックリンクを設定します。今回は以下のように設定しました。
mkdir -p ~/.local/include
ln -s $HOME/.local/libffi/3_2_1/lib/libffi-3.2.1/include/ffi.h $HOME/.local/include/
ln -s $HOME/.local/libffi/3_2_1/lib/libffi-3.2.1/include/ffitarget.h $HOME/.local/include/
mkdir -p ~/.local/lib
ln -s $HOME/.local/libffi/3_2_1/lib64/libffi.a $HOME/.local/lib/
ln -s $HOME/.local/libffi/3_2_1/lib64/libffi.la $HOME/.local/lib/
ln -s $HOME/.local/libffi/3_2_1/lib64/libffi.so $HOME/.local/lib/
ln -s $HOME/.local/libffi/3_2_1/lib64/libffi.so.6 $HOME/.local/lib/
mkdir -p ~/.local/lib/pkgconfig/
ln -s $HOME/.local/libffi/3_2_1/lib/pkgconfig/libffi.pc $HOME/.local/lib/pkgconfig/
環境変数の設定
libffiのインストールが環境したので、そのlibffiを利用出来るように環境変数(PATH)を設定していきます。coreserver v2はbashシェルなので、.bash_profileに以下の変数を追加していきます。
LD_LIBRARY_PATH=$HOME/.local/lib
PKG_CONFIG_PATH=$HOME/.local/lib/pkgconfig
追加設定した内容を反映させる
source ~/.bash_profile
環境が整ったので、pythonをインストールして、ライブラリをインストールします。
pyenv install 3.10.0
実は、色々なサイトの情報を収集してここまでは辿り着きましたが、これでは解決しなかったのです。これはcoreserver v2の環境の違いなのか判りませんが、ここまで来て置きながら心が折れて諦めてしまいそうになりました。
数日間、作業をやめて保留していましたが、海外等の情報を調べたりしてようやく答えにたどり着きました。以下の変数も更に追加することで問題を解決することが出来ました。
LDFLAGS="-L $HOME/.local/lib/"
CPPFLAGS="-I $HOME/.local/include/"
今回、以下のサイトの情報は非常に助かりました。
私の個人的なおすすめ商品を紹介しています。気になったものがあればどうぞ