0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

仮想環境外で pip install してしまった事故を防ぐ:PowerShell ラッパーで二重確認を導入する

Posted at

はじめに

Python で機械学習ライブラリなどを扱っていると、仮想環境(venv)に入っているつもりが入っていなかったという事故は一度は経験するのではないだろうか。
特に pip install torch を仮想環境外に打ってしまったときの絶望感といったらない。

本稿では、「うっかり非venv環境にライブラリをインストールしてしまう事故」 を防ぐために作成した PowerShell 関数を紹介する。
これは「正気か?」と二度聞いてくることで、実行者の正気を確認するラッパー関数である。

免責

記事含めAIに概ね作成させた。
動確はしたが予想外の被害が発生してもこれを保証しない

背景:事故の経緯

仮想環境(venv)に入って作業していたつもりが、別プロジェクト用のターミナルを開いてしまっていた。

その状態で、特に何の疑問も持たずに以下を実行してしまった。

pip install torch torchvision torchaudio

結果、グローバルなPython環境にPyTorchが入った。基本すべてをvenvで隔離しているので私は問題ないのだが、
この事件をきっかけに、仮想環境に入っていないときは本当にインストールしていいのかを二度確認する仕組みを導入したいと考えた。
インストールさせる時間ももったいないからね。

作ったもの

以下に示すのは、pippython -m pip に対する PowerShell のラッパー関数である。
特徴は以下のとおり。

  • venv環境下でないときにのみ作動する
  • pip install または python -m pip install を検出する
  • 二段階の確認を求める(Y/N → 「正気です」)
# --- 確認用関数 ---
function Invoke-PipInstallConfirm {
    [CmdletBinding()]
    param(
        [string]$CommandName,
        [string[]]$Args
    )

    $inVenv = -not [string]::IsNullOrEmpty($Env:VIRTUAL_ENV)

    if (-not $inVenv -and (
         ($CommandName -eq 'pip' -and $Args[0] -eq 'install') -or
         ($CommandName -eq 'python' -and $Args.Count -ge 3 -and $Args[0] -eq '-m' -and $Args[1] -eq 'pip' -and $Args[2] -eq 'install')
       )) {

        Write-Host '正気か?いいのか? (Y/N)' -ForegroundColor Yellow
        if ((Read-Host) -notmatch '^[Yy]$') {
            Write-Host '中止します。'
            return $false
        }

        Write-Host '二度目の確認: 「正気です」とタイプしてください' -ForegroundColor Yellow
        if ((Read-Host) -ne '正気です') {
            Write-Host '中止します。'
            return $false
        }
    }

    return $true
}

この関数を使い、pip および python コマンド自体をラップする。

# --- pip ラッパー ---
function pip {
    [CmdletBinding(DefaultParameterSetName = 'Default')]
    param(
        [Parameter(ValueFromRemainingArguments = $true)]
        [string[]]$Args
    )

    if (-not (Invoke-PipInstallConfirm -CommandName 'pip' -Args $Args)) {
        return
    }
    & pip.exe @Args
}

# --- python ラッパー ---
function python {
    [CmdletBinding(DefaultParameterSetName = 'Default')]
    param(
        [Parameter(ValueFromRemainingArguments = $true)]
        [string[]]$Args
    )

    if (-not (Invoke-PipInstallConfirm -CommandName 'python' -Args $Args)) {
        return
    }
    & python.exe @Args
}

使い方

PowerShell の Microsoft.PowerShell_profile.ps1 に貼り付ければよい。

notepad $PROFILE

そしてターミナルを開き直せば有効になる。

使用例

venvに入っていないときに実行すると、以下のように2段階で確認が入る:

正気か?いいのか? (Y/N)
> N
中止します。

または

正気か?いいのか? (Y/N)
> Y
二度目の確認: 「正気です」とタイプしてください
> いいえ
中止します。

注意点

  • pip show, pip list などの操作には干渉しない
  • あくまで「venv未使用のとき」にだけ警告するので、仮想環境を正しく使っている限り邪魔にならない
  • WSL環境などで仮想環境の判定が機能しないケースは手動確認が必要

おわりに

venvを前提としたPython開発において、「グローバル環境にインストールしてしまった事故」 は大きな混乱を招くことが多い。
このような事故を未然に防ぐため、機械的な安全装置を導入すること は非常に有効である。

「正気か?」と問いかけられることで、一度落ち着いて手元の環境を見直すことができる。
この記事が、同じような事故に悩む誰かの助けになれば幸いである。

おまけ:なぜ「正気です」なのか?

「Y」や「N」は勢いで押してしまうことがあるが、「正気です」とはっきり書かせることで、意思と注意を再確認させる。
これは悪意ある実行防止というより、本人が後で後悔しないようにするための自己防衛策である。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?