カテゴリー
PowerShell Windows 環境

pipenv 環境下で矢印キーを使い過去に入力された履歴を再利用する方法

PC上でVS Code を使っている場合には全く問題は生じませんが。サーバー等、開発環境を持ち込めないデバイス上でしか起きない問題をデバッグする時など、コマンドラインからの対話的入力操作が必要になってきます。このような場合に入力履歴が使えないと不便を強いられます。

かなり長い期間、解決方法を模索していましたが偶然解決方法が見つかったのでメモする事にしました。

コマンド・プロンプトを使う場合

start コマンドの引数に pipenv を渡します。下記はその事例です。

start pipenv run python

PowerShell を使う場合

Start-Process の引数に pipenv を渡します。下記はその事例です。

Start-Process -FilePath pipenv -ArgumentList run,python

留意点

どちらの場合でも、コマンドを投入したプロセスと同じ画面を共有する為のオプションが用意されています(start では /B、Start-Process では -NoNewWindow)が、これを使うとうまく動作しません。別な画面が開いてしまいますが、入力履歴が利用できるようになるメリットは大きいので目をつぶる事にしました。

カテゴリー
PowerShell Python

pip install -U pip 時に Fatal error in launcher: Unable to create process using ~ というエラーが発生した時の解決方法

かつて Python for Windows の v3.8.6 を c:\python-3.8.6-amd64 というフォルダへインストールして使っていました。

v3.8 系の新しいバージョン v3.8.10 へバージョンアップを試み、msi 形式をダウンロードページから入手しインストール。

インストールウイザードにデフォルト表示されたインストール先を変えずにそのまま  c:\python-3.8.6-amd64  へ上書きしました。

ところが、インストール後にこのインストール先の名前がどうにも気に入らなくなったので c:\python-3.8.10-amd64 へ変更しました。

フォルダ名変更を反映させる為レジストリも書き換えました。具体的には管理者モードで PowerShell を起動し次のコードを入力しました。事例は v3.8 なのでコピー&ペーストして再利用される際には十分お気を付けください

function Replace-PropValues {
    param(
        [string] $Path,
        [string] $Before,
        [string] $After
    )
    process {
        $regKey = (Get-Item -Path $path)
        $func = { $regKey.GetValue($args).Replace($Before,$After) }
        $regKey.Property.ForEach( {
            if ($_ -eq "(default)") {
                Set-ItemProperty -Path $regKey.PSPath -Name '(default)' `
                  -Value $func.Invoke('')
            }
            else {
                Set-ItemProperty -Path $regKey.PSPath -Name $_ `
                  -Value $func.Invoke($_)
            }
        })
    }
}
Replace-PropValues -Before "3.8.6" -After "3.8.10" `
  -Path "HKLM:\SOFTWARE\Python\PythonCore\3.8\InstallPath"
Replace-PropValues -Before "3.8.6" -After "3.8.10" `
  -Path "HKLM:\SOFTWARE\Python\PythonCore\3.8\PythonPath"

ついでにシステム環境変数 PATH に書かれていた古いインストール先の名前も変えこれで作業完了かと思い、pip のアップグレードを試みるため表題の通りのコマンドを入力したところ、エラーと遭遇しました。

C:\Users\foobar>pip install -U pip
Fatal error in launcher: Unable to create process using '"c:\python-3.8.6-amd64\python.exe"  "C:\python-3.8.10-amd64\Scripts\pip.exe" install -U pip': ??????????????????

10分間ほど googling の末に、次の2つのコマンド入力で解決できることが分かったので、投稿することにしました。

python -m pip uninstall pip
python -m ensurepip --upgrade

ensurepip の説明はこちら。なるほどねぇ…

因みに pipenv を使って仮想化していましたので次の作業も追加で必要でした。

python -m pip uninstall pipenv
python -m pip install --upgrade pipenv