« TinkerBoardのイメージバックアップを小さくできました | トップページ | pyenv-installerでpyenvを導入し、新旧Pythonを使う(2020/04/20追記) »

2020/04/17

PyenvをDebian10に入れて自作Pythonスクリプトの検証をしたところ… (2020/04/25追記)

「小説家になろう」の作品を一括取得して、BOOX Poke Proで読むスクリプトを作ったときに、参考にさせて頂いたスクリプトがそのままではSSLのエラーで動かず、Pythonのバージョンによって証明書の検証等をしないようにしていました(「検証しない」というオマジナイが3.4.2以前のPythonでエラーになるので場合分けする必要があった)。
この部分をずっと気持ち悪く感じていて、できればPythonのバージョンによる挙動を確認したいと思いつつ、複数のバージョンのPythonをインストールするのは危ないなと躊躇していました。
先日250GBのポータブルSSDを安く売っているのを見かけて、ノートPC(2012年製のvaio C)のUSBブートでLinux環境を作ることを思いつき、USBメモリからUSB SSDにUbuntu 18.04をインストールできました。
そこで、Anacondaを入れて仮想環境を作ろうとしたところ、作れる最低バージョンが3.5.6で、3.xのマイナーバージョンまでしか選ぶことができず、気になっている3.4.2と3.4.3での検証ができませんでした。
するとPyenvなどのツールを入れるしかないのですが、けっこう環境に手を入れることになりそうなので、VirtualBoxを「Ubuntuソフトウェア」から入れて、この元にi386(32bit)版でUbuntu 16.04より軽いDebian10 busterを入れて行うことにしました。
(VirtualBoxはOracleサイトの最新版はVer.6.1ですが、これだとVMが起動しませんでした。)

インストールにあたって、こちらを大いに参考にさせて頂きました:
PyenvによるPython3.x環境構築(CentOS, Ubuntu) - Qiita
この記事とは少し異なる部分もありましたので、以下ほぼコマンドの羅列ですが、私のやった手順をセクション内に記しておきます。

細々した手順 sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
cd /usr/local/
sudo git clone git://github.com/yyuu/pyenv.git ./pyenv
sudo mkdir -p ./pyenv/versions ./pyenv/shims
cd /usr/local/pyenv/plugins/
sudo git clone git://github.com/yyuu/pyenv-virtualenv.git
(これでvirtualenvが入っている筈だが、なぜか後で入れ直すことになった)
echo 'export PYENV_ROOT="/usr/local/pyenv"' | sudo tee -a /etc/profile.d/pyenv.sh
echo 'export PATH="${PYENV_ROOT}/shims:${PYENV_ROOT}/bin:${PATH}"' | sudo tee -a /etc/profile.d/pyenv.sh
(ここまでの設定を反映する)
source /etc/profile.d/pyenv.sh
pyenv --version
→ pyenv 1.2.18-4-g5b009e87
sudo visudo
---secure_pathをコメントアウトして2行追加---
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
Defaults env_keep += "PATH"
Defaults env_keep += "PYENV_ROOT"
---編集ここまで---
ここでsudoから/sbin:/bin:/usr/sbin:/usr/binへのPATHが無くなってしまうのでデフォルトユーザーの.bashrcに加える
vi ~/.bashrc
---
PATH="$PATH":/sbin:/bin:/usr/sbin:/usr/bin
---
source ~/.bashrc
いよいよPythonのインストール
pyenv install --list | grep ' 3.'
(インストールするバージョンを見定める)
time sudo pyenv install 3.4.2
(エラーが出てしまう。元々入っているlibssl1.1ではインストールできないらしい。)
debian10 busterではlibssl1.0のパッケージが削除されているので、debian9 strechのlibssl1.0libssl1.0-devをもらってくる。
sudo apt remove libssl-dev
sudo apt update
sudo apt install ~/Downloads/libssl1.0.2_1.0.2u-1~deb9u1_i386.deb
sudo apt install ~/Downloads/libssl1.0-dev_1.0.2u-1~deb9u1_i386.deb
再度インストールを実行
time sudo pyenv install 3.4.2
10分ぐらい掛かりましたが、これで無事にインストールできました。続けて 3.4.3, 3.5.9, 3.6.10, 3.7.3, 3.8.2を入れました(3.7.3は元々busterに入っているのと同じバージョンの素の環境)。但し、強制的にlibsslに古いバージョンを使っているので、テスト用に限るなどセキュリティに気をつけた方がいいと思います。
続けてvirtualenvで作業用の環境を作ろうとしたところ動かなかったので、あらためて入れ直しました。
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
.bashrcの末尾に次の一行を追加して読み込み直す
eval "$(pyenv virtualenv-init -)"
source ~/.bashrc
いよいよ作業環境の作成
time sudo pyenv virtualenv 3.4.2 dev3402
続けて3.4.3, 3.5.9, 3.6.10, 3.7.3, 3.8.2の作業環境を作りました。

できた環境のリストを取ります
200416pyenv
pyenv versions
---
* system (set by /home/pado/python/.python-version)
3.4.2
3.4.2/envs/dev3402
(略) 3.8.2
3.8.2/envs/dev3802
dev3402
dev3403
dev3509
dev3610
dev3703
dev3802
---
それではPython 3.4.2の作業環境に入って動かしてみます。
sudo pyenv local dev3402
./narou2az.py n3313gb
…素の環境ですからbs4が入っていません。
sudo pip3 install beautifulsoup4
(pipが古いとwarningが出ますが無視。アップデートすると動かなくなりました)
./narou2az.py n3313gb
無事に動きました。
以下、各作業環境にbs4を入れて動かしてを繰り返して、どのバージョンでも無事に動作することが確認できました。

さて、当初macOSのcommand line toolsで入れたPython3.7.3が出していたエラーを再現しようとしたところ、なんと出ません。
Python 3.4.2に無理矢理"ssl._create_default_https_context = ssl._create_unverified_context"のオマジナイを通すとエラーが出るのは仕様通りなのですが、Python 3.4.3以上でもオマジナイが必要ありません。
ええっ?と思いつつ、先日ひょんなことからPython3.7.7になったMacBook Airで確認したところ、やはりエラーが出ません。どうやらmacOSのPython 3.7.3固有の環境依存だったようです。
特殊な環境依存を回避できていたのだと思って納得しておきます(汗

パドラッパ from MacBook Air (2017)

ps. 何度かVirtualBoxが親OSを巻き込んで落ちて、ついにはVirtualBoxのDebianにログインできなくなってしまいました。これは遊びじゃないと使えないなぁと思ったり。

【2020/04/18記】
作業環境は持っておきたいので、libssl1.0-devが簡単に手に入るDebian 9 stretchで作り直したのですが、zlib1g-devが入っていないなどの違いがありました。その上、Python 3.6.10までは入ったものの、3.7.3のMake時にModuleNotFoundErrorが出て入らず(3.7.2も3.7.4も入らず、しかし3.8.2は入るという謎)、結局Debian 10で作り直すことになりました。ちなみにデフォルトのPythonは3.5.3でした。

【2020/04/25記】 pyenv-installerというのを使うと簡単にインストールできることを知って、VMのDebian9で環境構築した記事を2020/04/19に書いたのですが、追記し忘れていました!

【2020/04/25記】
Ubuntu 20.04 LTSがリリースされたのでアップデートしたところ、VirtualBoxも本文中で「立ち上がらなかった」と言及しているVer.6.1にアップデートされてしまい、案の定、VMが立ち上がらなくなってしまいました。設定ページを見るとハードウェア仮想化を無効にする必要があるとガイドされますが、そのように設定できません。
Screenshot-from-20200425-075335
私の場合、PC本体のBIOS設定を電源ONからのF2連打で立ち上げて、ハードウェア仮想化をEnableにすると立ち上がるようになりました。BIOSはいじりたくなかったのですけどね。
また、グラフィックスコントローラーをVBoxVGAからVMSVGAに変えるようにとガイドが出ますが、これに従うとDebian起動時にエラーが出ます。これは、こちらのブログと同じ現象です。エラーが出たままでも起動するのですが、一応VBoxVGAに戻すと消えるので、VBoxVGAが本格的に使えなくなるまで使い続けることにします。

| |

« TinkerBoardのイメージバックアップを小さくできました | トップページ | pyenv-installerでpyenvを導入し、新旧Pythonを使う(2020/04/20追記) »

コメント

コメントを書く



(ウェブ上には掲載しません)




« TinkerBoardのイメージバックアップを小さくできました | トップページ | pyenv-installerでpyenvを導入し、新旧Pythonを使う(2020/04/20追記) »