🔋

venvをPowershellで起動しやすくする。

2024/05/28に公開

前哨戦が最初のコード。追記戦が約一か月後のコード。

目的

ターミナル上であってもグローバルなvenvをどこからでも変更できるようにする。

前哨戦

ps1の作成

便利なコマンドを作成する。ps1ファイルのため、PowerShellからの起動限定となる。

param($a)
try{
. C:\Users\<name>\Documents\.venv\$a\Scripts\activate.ps1
}catch{
Write-Host "- venv list -"
Get-ChildItem C:\Users\<name>\Documents\.venv | Select-Object Name | Format-Wide
}

このコマンドは引数がない場合はvenvの一覧を表示し、引数に正しい名前がある場合はactivateを実行する。

>./g_venv.ps1
- venv list -


noob_3.10.10                                                noob_3.11.5
test_venv                                                   test_venv_1
test_venv_2                                                 test_venv_3


>./g_venv.ps1 test_venv_1
(test_venv_1) >

環境変数に登録する

環境変数のPathにさきほどのファイルが入っているフォルダーを指定する。
今後もなにか作りたいので、~~~/.cmdといった名前で登録。

実行

>g_venv
- venv list -


noob_3.10.10                                                noob_3.11.5
test_venv                                                   test_venv_1
test_venv_2                                                 test_venv_3


>g_venv test_venv_1
(test_venv_1) >

これでどこからでもvenvを起動することができる!


追記戦

いろいろな機能が欲しくなったので機能を追加。

ps1の作成

param([switch]$v,[switch]$g,[switch]$l,[switch]$c,[switch]$d,[switch]$h,$a)
$path = "C:\Users\$env:username\Documents\.venv\"
try
{
    If($v){
        if($a -ne $null){
            if (Test-Path $path\$a){
                Select-String -Path $path\$a\pyvenv.cfg '^v' | ForEach-Object {$_.line}
            }else{
                Write-Host 'No Path'
            }
        }else{
            Write-Host 'Version 1.0'
        }
    }elseif($g){
        if($a -ne $null){
            (Get-Content C:\Users\$env:username\Documents\.cmd\genv.ps1) |
             ForEach-Object { $_ -replace '^\$path\s=\s.*',"`$path = `"C:\Users\`$env:username\$a`""} |
             Set-Content C:\Users\$env:username\Documents\.cmd\genv.ps1
            Write-Host $path -> $a
        }else{
            Write-Host $path
        }
    }elseif($c){
        if($a -ne $null){
            if (Test-Path $path\$a){
                Write-Host '"'$a'"' is already in Path
            }else{
                python -m venv $path\$a
            }
        }else{
            Write-Host 'Enter one venv argument'
        }
    }elseif($d){
        if($a -ne $null){
            if (Test-Path $path\$a){
                del $path\$a
            }else{
                Write-Host 'No Path'
            }
        }else{
            Write-Host 'Enter one venv argument'
        }
    }Else{
        . $path\$a\Scripts\activate.ps1
    }
}catch{
    if($h){
        Write-Host "genv <folder name>"
        Write-Host '    If it is no an argument, check all venv folders.'
        Write-Host '    If it is an argument, run venv.'
        Write-Host "-l : check all venv folders"
        Write-Host "-h : display help for genv"
        Write-Host "-v <folder name> : check version"
        Write-Host '    If it is no an argument, check genv version.'
        Write-Host '    If it is an argument, check venv version.'
        Write-Host "-g <folder name> : check or change global venv folder"
        Write-Host '    If it is no an argument, check the current the global venv folder path to use.'
        Write-Host '    If it is an argument, change the global venv folder path to use.'
        Write-Host "-c <folder name> : creat global venv"
        Write-Host '    If it is an argument, creat the venv file.'
        Write-Host "-d <folder name> : deletes global venv"
        Write-Host '    If it is an argument, delete the venv file.'
    }else{
        if($a -ne $null){
            Write-Host 'No Path, displays help with "genv -h".'
        }else{
            Write-Host '-------------------- venv list --------------------'
            Get-ChildItem $path | Select-Object Name | Format-Wide
            Write-Host '---------------------------------------------------'
        }
    }
}

実行

> genv
-------------------- venv list --------------------

noob_3.10.10                                                noob_3.11.5

---------------------------------------------------
> genv noob_3.11.5
(noob_3.11.5) > deactivate
> genv -v noob_3.11.5
version = 3.11.5
> pyenv global 3.10.10
> genv -c abc
> genv
-------------------- venv list --------------------

abc                                                         noob_3.10.10
noob_3.11.5

---------------------------------------------------
> genv -v abc
version = 3.10.10
> genv -d abc
The item ~~~ to continue?
[Y] Yes ~~~ [?] Help (default is "Y"): y
> genv
-------------------- venv list --------------------

noob_3.10.10                                                noob_3.11.5

---------------------------------------------------

今後は

今回はvenv用として作成したが、いずれはpyenvではなくvirtualenvとしたいのでこちらのコードに変更できるように・・・まずは自身の環境をきれいにしたい。
https://qiita.com/dcm_ishikawa/items/beabdb488f0636cf95fc
https://qiita.com/shibukawa/items/0daab479a2fd2cb8a0e7
https://qiita.com/ksato9700/items/5d9eba10fe6b8e064178
pyenvよりvirtualenvがおすすめなのかな・・・。それとも複合的に使うのかな・・・。

Discussion