PowerShellでvirtualenvを使うには

virtualenvはPowerShellに対応していますが、PowerShellの設定によって使えない場合があります。その原因と対策についてまとめました。

## virtualenvのactivateで「PSSecurityException」が発生する原因
PowerShellでvirtualenvのactivateを使うと、以下のエラーが発生する場合があります。

```
> virtualenv.exe venv
> .\venv\Scripts\activate
.\venv\Scripts\activate : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\****\developme
nt\venv\Scripts\activate.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(http://go.microso
ft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\venv\Scripts\activate
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

これは、PowerShellのスクリプト実行ポリシーが原因です。現在の実行ポリシーは`Get-ExecutionPolicy`コマンドで確認できます。

```
> Get-ExecutionPolicy
Restricted
```

`Restricted`は「実行できるスクリプトはありません。Windows PowerShell は対話型モードでのみ使用できます。」という意味です。
実行ポリシーについての詳細は[Microsoftの公式ドキュメント](https://technet.microsoft.com/ja-jp/library/ee176847.aspx)を参照してください。

`Restricted`のままだとactivateすることができません。対策として以下の方法があります。

## 対策1
管理者権限付きでPowerShellを立ち上げ、`Set-ExecutionPolicy`コマンドで実行ポリシーを`RemoteSigned`に変更します。`RemoteSigned`は「ダウンロードしたスクリプトは信頼できる発行元が署名した場合にのみ実行できます。」という意味です。

```
> Set-ExecutionPolicy RemoteSigned
```

「実行ポリシーを変更しますか?」というダイアログが出るので、「Y」を入力してEnterで先に進めてください。

なお、[virtualenvの公式ドキュメント](https://virtualenv.pypa.io/en/stable/userguide/)には`Set-ExecutionPolicy AllSigned`でもいいと書いてあるのですが、[^#]私の環境では以下のエラーが出てactivateできませんでした。

[^#]: こう書いてあります→"In order to use the script, you can relax your system’s execution policy to AllSigned, meaning all scripts on the system must be digitally signed to be executed. Since the virtualenv activation script is signed by one of the authors (Jannis Leidel) this level of the execution policy suffices."

```
.\venv\Scripts\activate : ファイル C:\Users\****\development\venv\Scripts\activate.ps1 を読み込めません。ファイル
C:\Users\****\development\venv\Scripts\activate.ps1 はデジタル署名されていません。このスクリプトは現在のシステムで
は実行できません。スクリプトの実行および実行ポリシーの設定の詳細については、「about_Execution_Policies」(http://go.micr
osoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:1
+ .\venv\Scripts\activate
+ ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : セキュリティ エラー: (: ) []、PSSecurityException
    + FullyQualifiedErrorId : UnauthorizedAccess
```

## 対策2
virtualenvだけのために設定を変えたくないという人は、対策1のコマンドに`-Scope Process`オプションを付けて、「今開いているPowerShellウィンドウのみ実行ポリシーを変更」にするのがオススメです。この場合はPowerShellに管理者権限は必要ないです。

```
> Set-ExecutionPolicy RemoteSigned -Scope Process
```

毎回ダイアログが出るのが面倒なら`-force`オプションで省略できます。

## 対策後にvirtualenvのactivateを使ってみる
前述の対策実施後にactivateすればエラーは発生しなくなります。以下のように画面左にvirtualenvのディレクトリ名が表示されるはずです。

![powershell.jpg](https://qiita-image-store.s3.amazonaws.com/0/7809/abb1fb77-c6f4-548e-a6b1-88ef3cfebb98.jpeg)

## 参考資料
* [Get-ExecutionPolicy コマンドレットの使用](https://technet.microsoft.com/ja-jp/library/ee176847.aspx)
* [Tech TIPS：WindowsでPowerShellスクリプトの実行セキュリティポリシーを変更する - ＠IT](http://www.atmarkit.co.jp/ait/articles/0805/16/news139.html)
* [管理者権限なしでPowerShellスクリプトを実行する方法 - Qiita](http://qiita.com/alchemist/items/e6706cd425f8f5e5032e)
* [python - virtualenv in PowerShell? - Stack Overflow](https://stackoverflow.com/questions/1365081/virtualenv-in-powershell)
* [User Guide -- virtualenv 15.1.0 documentation](https://virtualenv.pypa.io/en/stable/userguide/)