⚙️

PowerShellスクリプトを実行できるように設定する

2023/09/22に公開

WindowsでPythonの仮想環境(virtual environments)を有効にしようとしたところ以下のエラーに遭遇したので回避方法をメモしておきます。

Activate.ps1
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を(管理者ではなく)起動して、Get-ExecutionPolicyを実行します。

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

とのことなので、このコマンドをこのまま実行します。

Set-ExecutionPolicy
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\> Get-ExecutionPolicy
RemoteSigned

RemoteSignedに変わりました。これはPowerShellのドキュメントによると、

スクリプトを実行できます。

とのことなので、問題なくActivate.ps1を実行できそうです。また、-Scope CurrentUserを指定しているので、他のWindowsユーザには影響はなく、現在サインイン中のユーザのみ設定が変わります。

仮想環境を有効にする

再度Activate.ps1を実行してみます。

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

無事に仮想環境が有効になりました。

設定を元に戻す

設定を元に戻すには以下のコマンドを実行します(-ExecutionPolicyUndefinedを指定しています)。

Set-ExecutionPolicy
PS C:\> Set-ExecutionPolicy -ExecutionPolicy Undefined -Scope CurrentUser
PS C:\> Get-ExecutionPolicy
Restricted

初期状態のRestrictedに戻りました。

蛇足

蛇足ですが・・・設定を元に戻す際、Undefinedと指定したのになぜRestrictedになるのか?ですが、以下のコマンドを実行してみます。

Get-ExecutionPolicy -List
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へ変更すると、

Set-ExecutionPolicy
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は未定義なので読み飛ばすと、現状適用されている一番優先順位が高い実行ポリシーはCurrentUserRemoteSignedになります(つまり、Activate.ps1等PowerShellスクリプトが実行可能な状態に設定されます)。

Discussion