follow me

Pythonのhashlibが使えない

Pythonのhashlibが使えない。
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, 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 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, 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 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が足りないのさえ分かれば、追加するだけのおしごとなので、簡単ですね。
Pythonのhashlibが使えない | 0 件のコメント | アカウント登録
サイト管理者はコメントに関する責任を負いません。