メインコンテンツへスキップ
見出し画像

Python 仮想環境と起動用スクリプトの検討 ~全自動環境構築で誰にでも簡単に使えるように~

    こんにちはRcatです。
    さて、最近取り入れているPythonを仮想環境について書いていこうと思います。
    詳しくは後で書きますが、仮想環境を使うことでプログラムごとに実行環境、つまりはライブラリのインストールなどを分けることができます。
    これを使うことで、ワンアクションでライブラリのインストールから実行までを完全に自動化することもできます。
    最下部では環境構築セットのみの配布も行っています。

    Pythonのインストールの仕方

    Pythonのインストールともう少し細かい話


    はじめに

    利用規約

    情報や作品の活用時は事前に利用規約をご確認ください。

    https://note.com/rcat999/n/nb6a601a36ef5

    コメントについて

    利用規約のガイドラインを確認の上コメントしてください


    仮想環境(VENV)とは

    仮想環境とは

    仮想環境とはPythonの実行環境をフォルダーごとに分けられる機能とでも言えばいいでしょうか。
    普通にPythonをインストールしただけでは、そのパソコンで1つのPythonの環境ですが、細かくフォルダごとに個別の実行環境を持つことができます。

    仮想環境を使うメリット

    例えばたくさんの作品を作っているが、それぞれ微妙に必要なライブラリのバージョンが違って競合するので普通に実行しようとすると、どちらかが起動できなくなるなんてことをありませんか?

    こんな時助かるのが仮想環境です。
    同じパソコンでもそれぞれの仮想環境に別々のバージョンのライブラリをインストールすることができます。

    また、インストールしているライブラリを列挙することもできますが、普段使っている環境だと本当に必要なライブラリがどれなのかわかんなくなってしまっていますよね。
    しかし、作品を作る時に仮想環境から作っていれば必要なライブラリだけをインストールし、簡単に列挙することができるようになります。
    そうすることで、他のパソコンでも同じ環境を再現しやすくなります。

    他にも作品を他者に使わせる場合、その人の環境を荒らさないというメリットもあります。
    初めてPythonをインストールする相手ならまだしも、既に使っていてバージョンに小うるさいライブラリを使っていたなら目も当てられません。
    しかし、配布した作品が仮想環境下で動くように作られている場合、相手のPython環境に一切変更を加えることなく実行することができます。これがメインの目的となります。


    仮想環境を有効化してライブラリをインストールする

    仮想環境の作り方をWindowsで確認してみましょう。

    まぁ調べば簡単に出てくるんですが、仮想環境を作るコマンドは以下です。
    一番最後のところが仮想環境を格納するフォルダの名前で、ここは自由につけることができます。
    この場合はvenvというフォルダが作成されその中に仮想環境が構築されます。
    追記:" --upgrade-deps"を追加。これによりpipなどが最新の状態で入ります。

    windows>python -m venv venv --upgrade-deps
    windows>dir /b
    venv

    仮想環境が出来上がったら、以下のコマンドを実行します。
    バッチファイルですが、ダブルクリックで起動してもすぐ閉じるだけなので、コマンドプロンプトから開くようにしてください。

    windows>venv\Scripts\activate.bat
    (venv) windows>

    実行すると一番左側に(venv)と表示され、仮想環境に切り替わったことが分かります。
    この状態でライブラリをインストールすると、この仮想環境だけにインストールされます。

    確認してみると以下のような感じです。
    最初は何もないのでまっさらですが、ライブラリをインストールすると、それと依存するライブラリが入ってきていることがわかります。

    (venv) windows>pip freeze
    (venv) windows>pip install requests
    
    --略--
    
    (venv) windows>pip freeze
    certifi==2024.8.30
    charset-normalizer==3.3.2
    idna==3.10
    requests==2.32.3
    urllib3==2.2.3

    仮想環境を抜ける場合は以下のコマンドを実行します。

    (venv) windows>deactivate
    windows>

    仮想環境スクリプトの検討(Windows)

    さて、仮想環境の作り方と有効化の方法が分かったところで、目的のスクリプトを起動できるところまで一連の動作を完全に自動化してみましょう。
    やることとしては次の通りです。

    一連の流れ

    1. 仮想環境の作成

    2. 仮想環境の有効化

    3. ライブラリのインストール

    4. ツールの実行

    手順としては簡単ですが、一つのスクリプトで環境構築もできてツールの起動もしたいので、2度目以降は4番だけ実行できるようにするなど、少し工夫が必要です。

    起動スクリプトの構成

    Windowsで起動する場合の仮想環境スクリプトについて考えていきましょう。

    今回はスクリプトを2つに分けてみました。
    理由としては、最初に述べたように1番から3番までを実行する時と4番だけしか実行しない時に分けたいからです。

    start.batの方がメインで使うバッチです。
    create.batの方は環境構築をするための専用バッチです。
    特にエラーもなく進めばcreateの方を直接使うことはありません。

    画像

    インストールエラー対策

    また、場合によってはライブラリのインストールで失敗することがあるので、そういった時はライブラリのインストールの方だけを単体で実行できるようにする目的もあります。
    ライブラリのインストールが失敗した経験には以下のようなことがあります。

    • C++のコンパイラが必要

    • gitコマンドが必要

    これらは開発者の場合はすでに入っているのでスルーしがちですが、そうではない人は当然入ってないのでエラーになることがあります。

    構築バッチの中身

    まずはメインのstart.batから見ていきましょう。
    中身は以下のようになっています。

    画像
    • 文字コードを切り替えている
      最初のコマンドはUTF8への文字コードに切り替えです。
      別にsjisで書けばいいんですが、そのうちこの辺もちゃんと直してくれることに期待してUTF8で書きます。

    • ディレクトリに移動と仮想ディレクトリの検索
      直接実行すればこのディレクトリから始まるはずではあるんですが、他のプログラムから呼び出すことなどを考えると、バッチの中でカレントディレクトリの移動をしておいた方が確実です。
      そして仮想フォルダがあるかどうか確認します。ない場合は初回起動と判定して環境構築をするという流れです。

    • 仮想環境の実行とスクリプトの起動
      一旦環境構築はスキップしまして15行目。仮想環境の有効化を行い、スクリプトを実行するという手順です。


    次にCreate.batです

    こちらは直接起動するか、仮想環境がない場合に呼び出されます。

    画像
    • カレントディレクトリの移動と仮想環境の検索
      単体で起動することも考慮して、startの時と同じ文言が入っています。
      仮想環境がない場合はvenvのコマンドを実行します。

    • ライブラリのインストール
      requirementsを使ってライブラリのインストールを行います。
      もしも途中でエラーが発生するとERRORLEVELが1になるので、正常に終わったのか、何かしらエラーになったのかを判定しています。

      • エラーになった場合
        プログラムやコンピューターに詳しい人だけが使う前提ではないので、メッセージを添えています。
        とはいえ、丸投げされても困るので、明確な責任の所在とどうすればいいのかをきちんと書いています。
        とはいえ、私も見過ごしてをしているかもしれないので、最初の1回はコメントで丸投げしてくれれば、それをそのまま記事に載せるので、他の人はそれを見て対応できるという仕組みです。
        また、一時停止するコマンドも仕込んでいます。それは普通のスクリプトなら終わったら閉じて欲しいですが、エラーだった場合メッセージを確認したいので閉じてもらっては困るのです。

    • 結果の返却
      ERRORLEVEL(一般的な言い方では終了コード)はEXITコマンドのBオプションで与えることができます。エラーだった場合は一応そうでない場合は0を返してstartのバッチに返します。

    実際に実行する

    実行するとこんな感じ
    画面に進捗状況が表示されて、最後にPythonが正常に移動していることが分かります。

    画像

    次にあえてエラーになるように適当なライブラリを書き込んでみました。
    この状態だと以下のような感じになります。

    画像

    きちんとエラーが出ていて、どう対応すればいいのかというメッセージが表示されていますね。

    Windowsの方はこんな感じでしょうか。


    仮想環境スクリプトの検討(Linux)

    続いてはLinuxでWindows同等のものを作っていきます。

    構築スクリプトの中身

    start.sh

    やってることはWindowsの方と同じですね。詳しくはそちらの解説を確認してください。
    こちらで違うところはカレントディレクトリに移動などは省略しているところです。
    だってシェルから実行するんですよね?確実に決めてやりますよね?。そういう観点から下手にスクリプトの方で動くのは避けました。
    そもそも場合によっては$0がスクリプトことではない場合があるので、使用を避けています。


    画像

    あとは下の方でコメント化しているのは無限ループです。例えば、自作のボットなどを作った時に再起動させたいが、メインのスクリプトが落ちてしまうと自動的に再起動させられませんよね?
    ということで、終了コードが2以外で終わった場合は無限ループするようなサンプルが書き込んであります。
    私が配布しているDiscordのボット用の起動スクリプトはこちらが採用されているはずです。

    create.sh

    次に環境構築バッチです。
    こちらは完全にWindowsの方と同じです。
    仮想環境フォルダーがない場合は作成から行い。ある場合はスキップしてライブラリのインストールだけを試行します。

    画像

    Windowsの時はタイムアウトを使ってシェルが閉じないようにしていましたが、Linuxの場合はそもそもシェルから実行するのでそういったものは入っていません。

    実際に実行してみる

    正常実行の場合

    画像

    エラーになった場合

    画像

    おまけ

    start.shを自動実行&定期実行する



    配布

    今回紹介した仮想環境を利用した起動バッチは配布を行います。
    そのままテキストで書かないのは自動処理かなんかで収集されてしまうのはなんか残念な気がするからです。

    配布URL

    https://script.google.com/macros/s/AKfycbxdcr8pnazR7RbjaSICTtaNWfN7h_rjQrKlZ3h9CZpPRFzRILk1OGc8mZqKbF-NXNO9/exec?name=Python自動環境構築バッチセット

    データの中身

    配布するデータには今回紹介した起動と構築以外にいくつか作業用のデータも追加します。
    それぞれの中身はダウンロードしてからのお楽しみ

    画像
    画像
    • WIndows

      • requirements_作成
        その名の通りrequirements.txtを作成するだけのスクリプトです。
        "requirements"が、地味に長くて打つのが面倒くさいので作りました。

      • 初回用作成
        そもそもツールを開発する時の仮想環境ってまっさらなものを用意してからインストールを手動で実行しますよね。
        このバッジを実行すると仮想環境を作った後、プロンプトが戻ってきて操作ができるようになります。
        要するに実験環境作成用ですね。

    • Linux

      • Linux.service
        systemdを使ったサービスとして登録するためのファイルです。
        自分で作ってももちろんいいですが、テンプレとして添付しておきます。

      • requirements_Create
        Windowsの方と同じです。

    それではまたお会いしましょう。
    ちなみにこのバッチの改良点があれば是非是非お寄せください。


     
     
    モノづくりが趣味。 "売ってないなら自分で作ればいいじゃない"をコンセプトに、機械/電気/AI/プログラム/ネットワーク 全部やります。 記事執筆はAI不使用。 ご連絡や利用規約はプロフィール記事参照。

    あなたへのおすすめ