LoginSignup
0
0

More than 3 years have passed since last update.

pip list がいつまでも終わらない。

Last updated at Posted at 2020-10-31

はじめに

Raspberry Pi Zero WのPython3を更新しようと、Python3.9をビルドしてインストールしました。
すると、pip listでインストール済みパッケージ一覧を確認する際に、リストもエラーも表示されずに止まってしまう症状に遭遇しました。Zeroだから時間がかかるのかな?と思い数時間放置してみましたが、変化ありませんでした。
ネットで検索してもズバリの回答が見当たらなかったため、ここに解決法を記します。

最後に追記あります。
この症状は、システムをバックアップを作成して複製後のSDカードで起動したり、host名を変更したことにより、乱数生成機の乱数が枯渇していたことが根本原因でした。

症状

pip listでインストール済みパッケージ一覧を確認すると、何も表示されません。
^Cで止めると、デバッグ情報がズラズラと出てきて、self._config = {'authkey': AuthenticationString(os.urandom(32))...が含まれるあたりでTerminateした事がわかります。

確認

python3で対話モードを起動して、以下のように入力して、エラーが帰ってきたら同様の症状です。(エラーは記録忘れました。Resource temporarily unavailableみたいな感じだったような)

>>> import os
>>> os.getrandom(1, flags=os.GRND_NONBLOCK)
b'\xf9'(これは、問題ない場合。問題があると、ここにエラーが出る)

対策

sudo mv /dev/random /dev/random.orig
sudo ln -s /dev/urandom /dev/random

pythonやpipとは無関係の、こちらの対策方法が参考になりました。
https://codz.me/2017/06/10/can-not-read-from-dev-random/

追記:なぜ起こったのか。対策は妥当なのか

Python3.9のインストールの直前、起動用SDカードをバックアップして複製したSDカードで起動、さらにhost名を変更しました。
どうやら、その過程で擬似乱数が枯渇した(または初期化された)ようです。
そのため、Blockingなrandomだと、乱数が溜まるまでリトライを繰り返していました。
上記の対策はunlockedな乱数生成機を強制的に使うようにする操作でした。副作用として、偏りのある乱数が使われる可能性があります。
しばらく運用して充分に乱数が溜まっていれば、もとのBlockingな乱数生成機に戻したほうが、あるべき姿になりそうです。
参考:https://ja.wikipedia.org/wiki//dev/random

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0