PyCharmのTerminalからpip
したのに何故かグローバルのsite-package
に追加されてしまう......
PyCharmのTerminalからPyInstaller
してもパッケージを読み込んでくれない......
何かおかしいと感じつつも原因を特定できずにいたのですが、
そもそも仮想環境が起動できていませんでした。
今回は仮想環境が起動できなかった原因とその対策について考えてみます。
追記(2023/11/17)
今更過ぎる追記ですが、PyCharmのバージョンを2023にアップデートしたところこの問題は発生しなくなりました。
結局原因はわかりませんでしたがとりあえず動くのでヨシ!
更新履歴
2022/03/11 : 初版
環境
- Windows10
- Python3.10
- PyCharm Community Edition 2021.2.2
1. PyCharmでの仮想環境
通常Pythonで仮想環境を扱う場合venv
など色々なコマンドを使用して構築する訳ですが、PyCharmではそれらを自動で設定してくれます。
プロジェクトを作成するときに作成されるvenv
フォルダがそれです。
myproject
├ myproject(ソースコード)
│ ├ __init__.py
│ └ main.py
└ venv(仮想環境)
├ Lib
│ └ site-packages
└ Scripts
├ activate.bat
├ activate.ps1
├ ......
└ python.exe
例えばmain.py
で次のように書いてみましょう。
import sys
print(sys.executable)
これは、実行中のpython.exe
のパスを表示するスクリプトです。
実際に実行してみると、次のようになると思います。
C:\work\myproject\venv\Scripts\python.exe
Pythonインストール時に生成されたグローバルのpython.exe
ではなく、先程仮想環境上に生成したpython.exe
を示していますね。
しっかり仮想環境が機能していることがわかると思います。
さて、このプロジェクトフォルダ内で色々作業する訳ですが、たまにコマンドを使うときがありますよね。
例えばパッケージをインストールしたいときはこんな風に。
python -m pip install numpy
PyCharmというのは優秀で、画面下にあるTerminal
をクリックした際、自動で仮想環境を起動してくれます。
つまりそのTerminal画面でpython
コマンドを使用したとき、実行されるのは仮想環境中のpython.exe
です。
そのため、このプロジェクトだけに対してパッケージをインストールし、他のプロジェクトに影響を与えない、といったことが可能になる訳です。
それを確かめるため、次のようなコマンドを打ってみましょう。
-c
オプションで続く文字列を実行します。
;
は改行を表しています。
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
PS C:\work\myproject>python -c "import sys; print(sys.executable)"
C:\Users\username\AppData\Local\Programs\Python\Python310\python.exe
......あれ?
2. 起動できてないやん!
冒頭にも書きましたが、Terminal上で仮想環境が起動できていないことに気付くまで長らく時間がかかりました。
だって、起動に成功している画面を一度も見たことがなかったから。
そもそもPyCharm以外で仮想環境に触れたことがなかったので、起動失敗に気付けませんでした。
起動成功時はこんな画面になります。
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
(venv) PS C:\work\myproject>
一目で違いがわかりますね。
先頭に(venv)
が付いています。
これは仮想環境のフォルダ名になります。
【補足】
Terminal上でpython
と打ってもpython
としか表示されない、またはMicrosoft Storeが開いてしまうといった場合は、グローバルのpython.exe
にパスが通っていない可能性が高いです。
設定しているはず!という方は、優先順位まで気にしてみてください。
Python\Python310
やPython\Python310\Scripts
をリストの上位に持ってくると解決する場合があります。
3. 原因
仮想環境が起動できていないことに気付いてから、その原因と対策を調べまわりました。
そして、手動では仮想環境を起動できるようになりました。
が、なぜかPyCharmのTerminalだと自動起動してくれない。
これについては正直、「これだ!」と確信できるような原因が見つかりませんでした。
現状、「PyCharmのバグの可能性が一番高い」という結論に落ち着いています。
ちなみにこの問題について以下のスレッドで議論が交わされてますが、最新投稿が2022/03/04と最近なので、今後新しい情報が出るかもしれません。
【参考】Python virtual envirnment is not automatically activated with powershell - youtrack
ただし、他の環境では違う原因の可能性もあるので、私が試してみたことを列挙してみます。
3.1 PyCharmの設定
File/Settings/Tools/Terminal
で、Shell integration
とActivate virtualenv
にチェックが入っていることを確認します。
これで解決したら苦労はしない。
3.2 PowerShellの権限
PyCharmが仮想環境を起動する際、特定のファイルを実行しています。
それがvenv/Scripts
にあるactivate
と名前がついているファイルです。
拡張子が色々ありますが、デフォルトではPowerShellスクリプトactivate.ps1
を実行しています。
(と、信じられています。)
しかし、Windowsのデフォルト設定ではPowerShellスクリプトの実行が「禁止」になっているようです。
PowerShellを起動して次のコマンドを打つことで、現在のPowerShell実行ポリシーを確認することができます。
Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine RemoteSigned
この実行ポリシーを色々変えてみたのですが、Terminalで仮想環境が自動起動されることはありませんでした。
【参考】PowerShellの実行ポリシー変更
3.3 パスに日本語などが入っている
プロジェクトのパスに日本語(全角文字)が入っていると自動起動が失敗する場合があります。
- パスに"デスクトップ"を含む
- パスに自分の名前(漢字)を含む
- パスに全角空白を含む
こういった場合は注意が必要です。
C:\work
など半角文字のみの場所にプロジェクトを作成してみて、自動起動できるかを試してみてください。
3.4 再起動
色々な設定を変更後、反映されていない可能性があります。
一度Terminal画面、PyCharm、PC本体などを再起動してみてください。
4. 対策
4.1 PowerShellではなくCMDを使用する
恐らくPyCharmのデフォルト設定では、Terminal画面でPowerShellを使用するようになっていると思います。
下の画像のShell path
にpowershell.exe
が指定されています。
このShell path
をcmd.exe
に書き換えた後、Terminal画面を再起動すると......
Microsoft Windows [Version 10.0.19043.1526]
(c) Microsoft Corporation. All rights reserved.
(venv) C:\work\myproject>
仮想環境が起動できました。
PowerShellの表記が消え、コマンドプロンプトの形式になっていることがわかります。
色が付いていない、再起動すると前回のコマンド履歴が消えるといった問題はありますが、一番簡単な対策なのではと思います。
4.2 activate.ps1を直接指定
やっぱりPowerShellが使いたい!という方へ。
下の画像のShell path
に次のように入力します。
powershell -NoExit -File ".\venv\Scripts\activate.ps1"
Terminal画面を再起動すると......
Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
(venv) PS C:\work\programming\PyCharm\myproject>
仮想環境が起動できました。
しっかりPowerShellを使用できていることもわかりますね。
【参考】PowerShell prompt doesn't show virtualenv - youtrack
4.3 PowerShell Profileを書き換える
私はPowerShellがさっぱりなのであくまで参考程度に。
PowerShellというのは「スクリプト実行前に必ず実行する処理」を別のスクリプトに用意しておけるらしいです。
【参考】owerShellでプロファイルを作成する方法
【参考】プロファイルについて - PowerShell | Microsoft
そのスクリプトに色々書いておくことで対応するという方法です。
【参考】PyCharmでteminalを(venv)pwshにする
【参考】PowerShell prompt doesn't show virtualenv
5. まとめ
という訳で、PyCharmのTerminalで仮想環境を自動起動できない原因と対処についてまとめました。
デフォルト設定だと誰もが引っかかりそうな罠だと思うのですが、あんまり情報が集まらず......
皆さんはうまく回避できているのでしょうか?