カテゴリー
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

カテゴリー
Windows 未分類

どうしても消せない異常な名前のファイルを意図せず作ってしまった時の消し方

下記を試したが何れも失敗

  • エクスプローラからそのファイルを選択して、DEL キーやポップアップメニューの「削除」
  • コマンドプロンプトから del コマンド
  • PowerShell から
    Get-ChildItem . -Filter <ファイル名の一部にマッチする文字列>| `
      ForEach-Object { Remove-Item -LiteralPath $_.Name }
  • コマンドプロンプトから
    del "\\?\<フルパス>"

解決方法

  1. 7-Zip を入手
  2. マニュアルに沿ってインストール
  3. コマンドプロンプトから下記のコマンドを実行する。-sdel というオプションがポイント
    7z a -sdel temp.zip <ファイル名の一部にマッチする文字列>
  4. カレントディレクトリに出来た temp.zip をエクスプローラなどで普通に消す