Python Microsoft Visual Studio 2019 Community PowerShell設定
Pythonの記事へ戻る
概要
正直、皆はまともにVisual StudioでAnacondaをうまく使えているのか?疑問に思う程、使いにくい設定方法であり、ある意味での問題。ある意味での不具合とも言える動き。でもVisual StudioのPytnon環境タブからのPowershell起動はこのPython環境を操作するためとは言っていない。Powershllを起動してやるから後のややこしいPythonを操作出来るまでの手順は自分でやれと言っているのかも知れない。冷たいっす。
こういったものに対処した記録です。
この記事を読み始める場合の前提条件。
- Anaconda3をVisualStudioを入れた後でインストールした。
- 先にAnaconda3を入れた場合は、後からPython環境の追加設定をする必要があるかもしれません。その場合のやり方は簡単なので、省略っすかね。Python環境タブの一番上のPython環境を追加をクリックして、既存の環境をクリックして、プレフィックスパスをAnacondaをインストールしたディレクトリにするだけです。
- Python開発環境を有効にしたVisualStudioをインストールした。
- Visual Studioをインストールした時にPython2.xとかPython3.xとかminiondaとか入れていても入れてなくてもいいです。でも、できれば入れてない方がいいかもしれませんがどうしてもPython3.6以上系を入れたいとかっていう人は入れてください。Anacondaの中でPython3.xを使うことが出来るので、必要はないと思いますが、どうしても単独環境がいるんや。っていう場合もあるかもしれないので、その場合は割かし大変な作業になりますが、切り替えて使ってもらえればと思います。
- Visual Studioを起動するとPython環境タブが表示できるようになっている。
- Visual StudioでPython開発環境を入れればタブは表示できるようになっていて、Ctrl+KとかCtrl+@で表示できます。メニューで言えば[表示]-[その他ウィンドウ]-[Python環境]です。
- Python環境タブでAnaconda3とPython3.8が認識されている。
- Anacondaをインストールするときに違う設定でインストールしたなら認識されているものが違うのかもしれません。現時点、何も手を加えずインストールしたら、先に述べた二つが認識できます。少なくともAnacondaが認識されていていればよいです。
- AnacondaへPathの環境変数追加の設定をした。
- コントロールパネルの[システム]の[システムの詳細設定]の[詳細設定]タブの[環境変数]でシステム側のpathという項目を編集して、新規ボタンから3つを登録します。
- C:\ProgramData\Anaconda3
- C:\ProgramData\Anaconda3\Scripts
- C:\ProgramData\Anaconda3\Library\bin
- C:\ProgramData\Anaconda3はインストールパスなので、違う場所にしている場合は合わせてください。
で、前提条件を満たしている場合。
以下のような具合にPowershellが起動します。
普通に起動します。でも問題があるので、全部は動きません。このときPowershellの制限がかかっているために動かないという感じです。
ちなみに、現時点の話なので、AnacondaとPythonのバージョンを示しておきます。
$ conda --version
conda 4.8.3
$ python --version
Python 3.8.3
以下のコマンドを使えば、conda環境が初期化されて、うまく動くようになるらしいのですが、残念な結果になります。やってみましょう。
$ conda init powershell
このとき、初期化のためのprofile.ps1という名前のpowershell起動設定が出来上がります。
- C:\Users\[ユーザ名]\Documents\WindowsPowerShell
というディレクトリです。
でも、このとき作成されたコマンドは正しいのですが、上手く動作しません。もう一度パワーシェルをVisual Studioから起動すると以下のようなエラーが表示されるようになったと思います。
. : このシステムではスクリプトの実行が無効になっているため、ファイル C:\Users\[ユーザ名]\Documents\WindowsPowerShell\profile.ps1 を読み込むことができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:3
+ . 'C:\Users\[ユーザ名]\Documents\WindowsPowerShell\profile.ps1'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : セキュリティ エラー: (: ) []、PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
というエラーです。
中身は以下のようなモノで
(& "C:\ProgramData\Anaconda3\Scripts\conda.exe" "shell.powershell" "hook") | Out-String | Invoke-Expression
のような感じのコマンドです。コマンド自体は正しいですが、再度profileとして、profile.ps1を呼び出しても動きません。以下のようなエラーが出ます。
profile : 用語 'profile' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
発生場所 行:1 文字:1
+ profile
+ ~~~~~~~
+ CategoryInfo : ObjectNotFound: (profile:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException
なぜなのか
$ Get-ExecutionPolicy
Restricted
となるからです。これは権限に制限がかかった状態を意味しています。バッチスクリプトのようなコマンドが実行できません。あと、コマンド自体にも改良すべき点があります。
正しい動きとは何かを見ましょう。知ってるかもしれませんが…
スタートメニューから[Anaconda3]-[Anaconda Powershell Prompt(Anaconda3)]を起動してみましょう。そう!それが正しい動きなんです。
(base)というプロンプトになったと思います。conda環境を制御できる状態です。conda環境=anacondaと考えてもよいと思います。この道を究めれば、その呼び方の違いの理解が進むと思います。極めている人は、またいい加減なこと言ってるなと思ったと思います。(base)表記は、環境を切り替えると(py38)のようにもなります。無い状態では大したことは出来ないです。その変わり続けて違うシステムを使うとすると、(base)状態では、まずいこともあります。例えばanacondaにも含まれるrubyとかのシステムが別でインストールしている分が動かず、anacond側のあまりruby構築を意識していない方が呼ばれたりする。そんな感じです。その場合にはconda deactivateというコマンドで(base)が外れます。
この動作はどうやって実現されているのかを知るべく、今度はスタートメニューから[Anaconda3]-[Anaconda Powershell Prompt(Anaconda3)]で右クリックして表示されるメニューから[その他]-[ファイルの場所を開く]。それでエクスプローラでファイルが見れる状態になるので、[Anaconda Powershell Prompt(Anaconda3)]を右クリックして、[プロパティ]を選択します。するとリンク先欄に
%windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy ByPass -NoExit -Command "& 'C:\ProgramData\Anaconda3\shell\condabin\conda-hook.ps1' ;
conda activate 'C:\ProgramData\Anaconda3' "
と上記のようなことが行われていることを知ることが出来ます。C:\ProgramData\Anaconda3の部分はAnaconda3をインストールしたフォルダです。このようにパワーシェルを起動するときにオプションが設定されていないといけないことになっています。これはWindowsの都合に合わせてくれています。Anaconda優秀ぅ~!なのに、Visual Studioから起動するときにはこれがありません。いろいろやっても普通に動くわけねぇ。って感じです。パワーシェルをVisual Studioから起動できるリンクの存在意義。なんのために。実に惜しい。VS Codeを使えってことか。同じか。確かめていません。
上記のconda-hook.ps1その中身はこう書かれています。みなさんのもそれぞれのインストールした場所に合わせてそうなっているので開いてみてください。
$Env:CONDA_EXE = "C:\ProgramData\Anaconda3\Scripts\conda.exe"
$Env:_CE_M = ""
$Env:_CE_CONDA = ""
$Env:_CONDA_ROOT = "C:\ProgramData\Anaconda3"
$Env:_CONDA_EXE = "C:\ProgramData\Anaconda3\Scripts\conda.exe"
Import-Module "$Env:_CONDA_ROOT\shell\condabin\Conda.psm1"
Add-CondaEnvironmentToPrompt
conda activate
C:\ProgramData\Anaconda3の部分はAnaconda3をインストールしたフォルダです。それで、この中身をコピーして、最初の方に出てきたprofile.sp1にペロッて貼り付けます。
そしたら、最後にペロッて貼ったやつを動かす権限を得るべく。
PS $> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (https://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [A] すべて続行(A) [N] いいえ(N) [L] すべて無視(L) [S] 中断(S) [?] ヘルプ (既定値は "N"): y
- Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
これを実行すれば権限を得ることが出来ます。RemoteSignedの部分は以下のようなものが選べます。
- AllSigned
- 全ての権限を取得するわけではありません。通信を介する全てのスクリプト、およびローカルのスクリプトが署名付きで実行されなければならないとされています。opensslとかを使います。あまり実用的ではないです。
- Bypass
- これが一番、強い権限を取得するといっても過言ではない。何にもチェックもしなければ警告もしない。ある意味危険な状態。権限を得るということは危険なことが出来るということ。
- RemoteSigned
- これがよく使われる奴です。ローカルはなんでもよくて、通信を介するスクリプトは署名が必要。自分のPCにあるくらいだから安全でしょっていう奴です。ウィンドウズサーバの通常のポリシーです。
- Restricted
- ウィンドウズクライアントの標準のポリシーです。スクリプトの実行はできません。
- Undefineed
- 他のユーザから設定された権限をクリアするものです。まずはRestrict状態に移行します。
- Unrestricted
- 制限を解除するものです。署名付きスクリプトの場合は内容を確認してから実行します。Windows以外のpowershellでの標準です。
CurrentUserの部分は以下のものが選べます。
- Process
- 起動したPowershell内だけの権限変更になります。
- CurrentUser
- 自分自身に対しての変更
- LocalMachine
- 全ユーザに対しての変更
Set-ExecutionPolicy Restricted
権限は、上記のように戻すことも出来ます。緩めているとうっかり良くないコマンドを打つことはあるかもしれません。気になる人は、使う時にだけこまめにRemoteSignedという権限を得れば良いと思います。-Scopeの後ろは今使っている人にだけというものです。それ以上に必要はないと思います。この他にも権限状態はありますが、それは個別の違う案件で使ってみてください。RemoteSignedとCurrentUserの部分にいろいろなキーワードがあります。
ここまでの知識を得た上でもう一度、AnacondaがPowershellを起動するときの引数を見てみると、更にBypassという権限で実行したいという感じで設定されていることが把握できると思います。
Pythonの記事へ戻る