PowerShellスクリプトを実行できるように設定する
WindowsでPythonの仮想環境(virtual environments)を有効にしようとしたところ以下のエラーに遭遇したので回避方法をメモしておきます。
PS C:\project> & c:/project/venv/Scripts/Activate.ps1
& : このシステムではスクリプトの実行が無効になっているため、ファイル C:\project\venv\Scripts\Activate.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:3
+ & c:/project/venv/Scripts/Activate.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
前提
- PowerShell 5.1
- Python 3.10
- Windows 11 Pro
公式ドキュメント
- PowerShell: about_Execution_Policies
- Python: venv — Creation of virtual environments
設定を確認する
PowerShellを(管理者ではなく)起動して、Get-ExecutionPolicy
を実行します。
PS C:\> Get-ExecutionPolicy
Restricted
Restricted
はPowerShellのドキュメントによると、
個々のコマンドを許可しますが、スクリプトは許可しません。
.ps1など、すべてのスクリプトファイルの実行を禁止します。
なので、Activate.ps1
は実行できない状態です。
設定を変更する
venvのドキュメントによると、
Microsoft Windows では、ユーザー向けの実行ポリシーを設定して Activate.ps1 スクリプトが使えるようにする必要があるかもしれません。 この設定は次の PowerShell コマンドでできます:
PS C:> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
とのことなので、このコマンドをこのまま実行します。
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\> Get-ExecutionPolicy
RemoteSigned
RemoteSigned
に変わりました。これはPowerShellのドキュメントによると、
スクリプトを実行できます。
とのことなので、問題なくActivate.ps1
を実行できそうです。また、-Scope CurrentUser
を指定しているので、他のWindowsユーザには影響はなく、現在サインイン中のユーザのみ設定が変わります。
仮想環境を有効にする
再度Activate.ps1
を実行してみます。
PS C:\project> & c:/project/venv/Scripts/Activate.ps1
(venv) PS C:\project> gcm python.exe
CommandType Name Version Source
----------- ---- ------- ------
Application python.exe 3.10.61... C:\project\venv\Scripts\python.exe
無事に仮想環境が有効になりました。
設定を元に戻す
設定を元に戻すには以下のコマンドを実行します(-ExecutionPolicy
にUndefined
を指定しています)。
PS C:\> Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
PS C:\> Get-ExecutionPolicy
Restricted
初期状態のRestricted
に戻りました。
蛇足
蛇足ですが・・・設定を元に戻す際、Undefined
と指定したのになぜRestricted
になるのか?ですが、以下のコマンドを実行してみます。
PS C:\> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
このコマンドはすべてのスコープの実行ポリシーを表示するのですが、現状すべてUndefined(未定義)となっています。PowerShellのドキュメントによると、
すべてのスコープでの実行ポリシーがUndefinedの場合、有効な実行ポリシーはWindowsクライアントではRestrictedとなる
とのことなので、(-List
を付けない)Get-ExecutionPolicy
(そもそも今起動中のPowerShellに適用されている実行ポリシーはなにか?)の結果がRestricted
になります。また、再度実行ポリシーをRemoteSigned
へ変更すると、
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser RemoteSigned
LocalMachine Undefined
と変化します。一覧には優先順位が高いポリシーから順に表示されているのですがUndefined
は未定義なので読み飛ばすと、現状適用されている一番優先順位が高い実行ポリシーはCurrentUser
のRemoteSigned
になります(つまり、Activate.ps1
等PowerShellスクリプトが実行可能な状態に設定されます)。
Discussion