Python 2.x系は2020年で期限を迎えるのでクローズドな開発環境でもそろそろPython 3がマストになってくるお年頃。
だがしかし、CentOS7.xのデフォルトはPython2.xなのです。
# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
# python –version
Python 2.7.5
今回は外部のネットワークに繋がらない孤高なCentOS 7さんにPython 3.x系の環境を構築していきたいと思います。
※CentOS 7 ・Python 3.x環境構築で検索すると、yumする方法がよくヒットしますが、オフラインならソースからインストールした方が楽な気がします。
1.インストール手順
1.python3のソースをダウンロード
https://www.python.org/downloads/source/
2.↑のtarballをサーバに配置
3.解凍# tar Jxvf Python-3.7.4.xz
4.解凍したフォルダに入る# cd ./Python-3.7.4
5.makefileの作成# ./configure --prefix=/usr/local/python374 --with-ensurepip
※python3のインストール先とpipのインストールを指定している。optimizationとか指定する場合もここ。
6.必要なパッケージのインストール# yum -y install zlib-devel openssl-devel tk-devel libffi-devel
7.make# make
※エラーが出た場合は→トラブルシューティング
Python build finished successfully!
と出力されれば成功です。
※optionalのモジュールのエラー・not found系は必要なければ無視しても問題ありません。
8.インストール
# make install
9.python3で実行できるようにシンボリックリンクを作成# ln -s /usr/local/python374/bin/python3.7 /usr/bin/python3
※“python”に対してシンボリックを張ってしまうとシステムで使ってるpython2の方が死んでしまうので注意。
pipも同様にpip3にシンボリックを作成しておく
# ln -s /usr/local/python374/bin/pip3.7 /usr/bin/pip3
10.確認# python3 --version
Python 3.7.4と表示されれば完了です。
2.トラブルシューティング
unknown type name ‘uuid_t’ のエラーの対処
makeした際に↓のようなエラーが出た場合
/root/Python-3.7.4/Modules/_uuidmodule.c: In function ‘py_uuid_generate_time_safe’:
/root/Python-3.7.4/Modules/_uuidmodule.c:18:5: error: unknown type name ‘uuid_t’
uuid_t uuid;
^
/root/Python-3.7.4/Modules/_uuidmodule.c:35:5: error: implicit declaration of function ‘uuid_generate_time’ [-Werror=implicit-function-declaration]
uuid_generate_time(uuid);
^
/root/Python-3.7.4/Modules/_uuidmodule.c:36:33: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
return Py_BuildValue(“y#O”, (const char *) uuid, sizeof(uuid), Py_None);
~~中略~~
Failed to build these modules:
_uuid
上記のエラーはuuid.hをmakeの時に参照できていないためエラーになっているようです。以下のいずれかのdefineを切ってmakeしてあげるとうまくいくはずです。
uuid.hが”/usr/include/uuid/uuid.h”にいる場合
# make CFLAGS=-DHAVE_UUID_UUID_H
uuid.hが”/usr/include/uuid.h”にいる場合
# make CFLAGS=-DHAVE_UUID_H
※と思っていたのですが、どちらで指定してもコンパイル通りますね。。。謎です。。。
ctypesのモジュールのビルドに失敗した場合
Failed to build these modules:
_uuid
↑のようなエラーが出力された場合は、”libffi-devel”のパッケージが入っていないことが原因であることが多いです。
また、ビルドエラーの多くはパッケージが入っていないことが原因ですので今一度確認してみてください。
コメント