🔋
venvをPowershellで起動しやすくする。
前哨戦が最初のコード。追記戦が約一か月後のコード。
目的
ターミナル上であってもグローバルな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としたいのでこちらのコードに変更できるように・・・まずは自身の環境をきれいにしたい。
pyenvよりvirtualenvがおすすめなのかな・・・。それとも複合的に使うのかな・・・。
Discussion