はじめに
Python で機械学習ライブラリなどを扱っていると、仮想環境(venv)に入っているつもりが入っていなかったという事故は一度は経験するのではないだろうか。
特に pip install torch
を仮想環境外に打ってしまったときの絶望感といったらない。
本稿では、「うっかり非venv環境にライブラリをインストールしてしまう事故」 を防ぐために作成した PowerShell 関数を紹介する。
これは「正気か?」と二度聞いてくることで、実行者の正気を確認するラッパー関数である。
免責
記事含めAIに概ね作成させた。
動確はしたが予想外の被害が発生してもこれを保証しない
背景:事故の経緯
仮想環境(venv)に入って作業していたつもりが、別プロジェクト用のターミナルを開いてしまっていた。
その状態で、特に何の疑問も持たずに以下を実行してしまった。
pip install torch torchvision torchaudio
結果、グローバルなPython環境にPyTorchが入った。基本すべてをvenvで隔離しているので私は問題ないのだが、
この事件をきっかけに、仮想環境に入っていないときは本当にインストールしていいのかを二度確認する仕組みを導入したいと考えた。
インストールさせる時間ももったいないからね。
作ったもの
以下に示すのは、pip
や python -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」は勢いで押してしまうことがあるが、「正気です」とはっきり書かせることで、意思と注意を再確認させる。
これは悪意ある実行防止というより、本人が後で後悔しないようにするための自己防衛策である。