Pythonのhashlibが使えない
2019年1月20日(日) 00:49 JST
閲覧数 5,253
Pythonのhashlibが使えない。
OpenWrtではまったから残しておこう。
複数Python入れてたり、クロスビルド環境として一時環境作ってたりすると起こるケースがままありそう。
普通にOpenSSLのライブラリが見える位置にいるのかという話ではあるのだが、Pythonをやらない人からすると面倒くさいのです。
しかも、nodeのビルドをしたいだけなのに、Pythonのhashlibとかではまるとか考えないのですよ。
ちなみに、OpenWrtでビルドできなかったときのメッセージはこうなってました。
OpenWrtは、クロスビルド環境を構築する際に、パッケージ構成やバージョンにも依存するのですが、この様にビルド環境のホストOSのPythonではなく、ビルドしなおしたPythonを使用する形になる事があります。
gccもビルドしなおしたものを利用しているので、ホストOSのlibssl.so、libcrypto.soを使用してもPythonと整合性がとれなくなるので無駄です。
しばらく頭を抱えつつ、staging環境のPythonを実行してみてやっと気がついた訳なのですが。
こんなことが起きるなら、Pythonのビルドとインストールの時にエラーになりそうなものなのだが、おそらくはインストール時はホストOS環境のopenssl-devを参照しているのだろう。。。
libssl.so、libcrypto.soが足りないのさえ分かれば、追加するだけのおしごとなので、簡単ですね。
OpenWrtではまったから残しておこう。
複数Python入れてたり、クロスビルド環境として一時環境作ってたりすると起こるケースがままありそう。
普通にOpenSSLのライブラリが見える位置にいるのかという話ではあるのだが、Pythonをやらない人からすると面倒くさいのです。
しかも、nodeのビルドをしたいだけなのに、Pythonのhashlibとかではまるとか考えないのですよ。
ちなみに、OpenWrtでビルドできなかったときのメッセージはこうなってました。
make[3]: Entering directory '/home/dev/LinkIt7688/chaos_calmer-15.05.1/feeds/packages/lang/node' (cd /home/dev/LinkIt7688/chaos_calmer-15.05.1/build_dir/host/node-v0.12.7/; if [ -x configure ]; then cp -fpR /home/dev/LinkIt7688/chaos_calmer-15.05.1/scripts/config.{guess,sub} /home/dev/LinkIt7688/chaos_calmer-15.05.1/build_dir/host/node-v0.12.7// && python ./configure --dest-os=linux --without-snapshot --prefix=/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/ ; fi ) ERROR:root:code for hash md5 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, inglobals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type md5 ERROR:root:code for hash sha1 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha1 ERROR:root:code for hash sha224 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha224 ERROR:root:code for hash sha256 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha256 ERROR:root:code for hash sha384 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha384 ERROR:root:code for hash sha512 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha512 Traceback (most recent call last): File "./configure", line 992, in configure_node(output) File "./configure", line 530, in configure_node o['variables']['gcc_version'] = 10 * cc_version[0] + cc_version[1] IndexError: tuple index out of range Makefile:72: recipe for target '/home/dev/LinkIt7688/chaos_calmer-15.05.1/build_dir/host/node-v0.12.7/.configured' failed make[3]: *** [/home/dev/LinkIt7688/chaos_calmer-15.05.1/build_dir/host/node-v0.12.7/.configured] Error 1 make[3]: Leaving directory '/home/dev/LinkIt7688/chaos_calmer-15.05.1/feeds/packages/lang/node' package/Makefile:191: recipe for target 'package/feeds/packages/node/host/compile' failed make[2]: *** [package/feeds/packages/node/host/compile] Error 2 make[2]: Leaving directory '/home/dev/LinkIt7688/chaos_calmer-15.05.1' package/Makefile:188: recipe for target '/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.package_compile' failed make[1]: *** [/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/stamp/.package_compile] Error 2 make[1]: Leaving directory '/home/dev/LinkIt7688/chaos_calmer-15.05.1' /home/dev/LinkIt7688/chaos_calmer-15.05.1/include/toplevel.mk:181: recipe for target 'world' failed make: *** [world] Error 2
OpenWrtは、クロスビルド環境を構築する際に、パッケージ構成やバージョンにも依存するのですが、この様にビルド環境のホストOSのPythonではなく、ビルドしなおしたPythonを使用する形になる事があります。
$ cd staging_dir/host/bin $ ls -al |grep python lrwxrwxrwx 1 dev dev 7 Jan 15 05:38 python -> python2 lrwxrwxrwx 1 dev dev 9 Jan 15 05:38 python2 -> python2.7 -rwxr-xr-x 1 dev dev 8809728 Jan 15 05:38 python2.7 -rwxr-xr-x 1 dev dev 1735 Jan 15 05:38 python2.7-config lrwxrwxrwx 1 dev dev 16 Jan 15 05:38 python2-config -> python2.7-config lrwxrwxrwx 1 dev dev 14 Jan 15 05:38 python-config -> python2-configおかげで、そのビルドしなおした環境が参照するOpenSSLのlibssl.so、libcrypto.soが見つからないという状態が起きてました。
gccもビルドしなおしたものを利用しているので、ホストOSのlibssl.so、libcrypto.soを使用してもPythonと整合性がとれなくなるので無駄です。
しばらく頭を抱えつつ、staging環境のPythonを実行してみてやっと気がついた訳なのですが。
$ cd staging_dir/host/bin $ ./python Python 2.7.12 (default, Jan 15 2019, 05:38:06) [GCC 7.3.0] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> import md5 ERROR:root:code for hash md5 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, inglobals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type md5 ERROR:root:code for hash sha1 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha1 ERROR:root:code for hash sha224 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha224 ERROR:root:code for hash sha256 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha256 ERROR:root:code for hash sha384 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha384 ERROR:root:code for hash sha512 was not found. Traceback (most recent call last): File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 147, in globals()[__func_name] = __get_hash(__func_name) File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/hashlib.py", line 97, in __get_builtin_constructor raise ValueError('unsupported hash type ' + name) ValueError: unsupported hash type sha512 Traceback (most recent call last): File " ", line 1, in File "/home/dev/LinkIt7688/chaos_calmer-15.05.1/staging_dir/host/lib/python2.7/md5.py", line 10, in from hashlib import md5 ImportError: cannot import name md5 >>> quit()
こんなことが起きるなら、Pythonのビルドとインストールの時にエラーになりそうなものなのだが、おそらくはインストール時はホストOS環境のopenssl-devを参照しているのだろう。。。
libssl.so、libcrypto.soが足りないのさえ分かれば、追加するだけのおしごとなので、簡単ですね。