コードを実行するだけでも、時には非常に困難になります。
コードを動かすためには、まず pip install
で必要なライブラリを導入しなければなりません。
しかしインストール中に次のようなエラーが発生しました:
× Failed to build installable wheels for some pyproject.toml based projects
╰─> dlib
調べてみると、その原因は Python 3.13 が新しすぎて、一部のライブラリがまだ対応していない ことにありました。
大規模なプロジェクトや依存関係が多い環境では、ひとつの更新が全体に影響し、環境の違いによるエラーも少なくない ということを改めて実感しました。
Python バージョンを下げる
以上の問題を解決のために、
- Python 3.11 をインストール
- プロジェクトに仮想環境(venv)を構築する
- dlibのライブラリを用意する
VS Code の自動仮想環境
まず、仮想環境について
仮想環境の作り
py -m venv [仮想環境名]
仮想環境名は環境を識別するための名前であり、例えば複数のプロジェクトが同時に存在するときに、それぞれを区別するために必要となります。
特定の Python バージョンを指定して仮想環境を作成したい場合は、次のようにします:
py -3.11 -m venv [仮想環境名]
(今回は-3.11とする)
なお、-m はライブラリモジュールをスクリプトとして実行するオプションです。今回の場合は venv モジュールを実行します。
もし -m を付けなければ、Python は venv をモジュールではなくスクリプトとして解釈し、その名前のスクリプトファイルを探そうとします。
仮想環境を削除したい場合は、単に [仮想環境名] のフォルダを削除すれば問題ありません。
プロジェクト本体には影響しません。
今回は慣例的によく使われる仮想環境名 .venv を使用します。
仮想環境に入る
仮想環境に入るときは、以下のコマンドを実行します。
.venv\Scripts\activate.bat
もしくは
.venv\Scripts\activate
仮想環境から退出するときは、次のコマンドを実行します。
deactivate
興味深いのは、VS Code の cmd を開くとすぐに次のように表示されたことです。
(.venv) D:\Code>
これは、仮想環境が自動的に有効化されていることを示しています。調べたところ、VS Code の Python 拡張機能が自動で仮想環境を有効化するよう設定されていると分かりました。これは一度設定すれば、以降も自動的に有効になります。また、このステップではもう一つの問題に遭遇しました。
PowerShell の制限
実は仮想環境に入りたいとき、PowerShell で次のようなメッセージが表示された。
このシステムではスクリプトの実行が無効になっているため、ファイル \Scripts\activate.ps1 を読み込むこと
ができません。詳細については、「about_Execution_Policies」(https://go.microsoft.com/fwlink/?LinkID=135170) を参照してください。
発生場所 行:1 文字:3
+ & D:/Code/FaceAnalyse/.venv/Scripts/Activate.ps1
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : SecurityError: (:) [],PSSecurityException
+ FullyQualifiedErrorId : UnauthorizedAccess
これを回避するために、PowerShell ではなく cmd を利用しました。
ではそもそもこの二つの違いは?
PowerShell と cmd の違い
-
cmd(コマンドプロンプト)
- 元々は DOS 時代のシェルで、機能は非常に限定的。
- 1 行ずつコマンドを実行するか、
.bat
/.cmd
バッチファイルを処理できる程度。 - セキュリティ署名の仕組みもなく、モジュール化やオブジェクト指向の概念もない。
-
PowerShell
-
2006 年に Microsoft が設計し直した新世代のシェル。cmd よりもはるかに高機能。
- 互換性も重視されており、aliasという別名仕組みで cmd の基本コマンド(例:dir, copy, del など)利用可能。 Linux 系のコマンドの一部も使えるようになっている。
- .NET API の直接呼び出し、レジストリ操作、WMI、リモート管理などが可能。
-
.ps1
スクリプトやモジュールを使えば、システム管理をほぼ完全に自動化できる。
- ただし強力すぎるため、Microsoft は 実行ポリシー (ExecutionPolicy) を導入し、悪意あるスクリプトの誤実行を防止している。(強力さは便利さと同時にリスクも伴うということですね)
-
2006 年に Microsoft が設計し直した新世代のシェル。cmd よりもはるかに高機能。
PowerShell のスクリプト実行を解禁する方法
PS C:\WINDOWS\system32> Get-ExecutionPolicy -List
Scope ExecutionPolicy
----- ---------------
MachinePolicy Undefined
UserPolicy Undefined
Process Undefined
CurrentUser Undefined
LocalMachine Undefined
英語名詞 (Scope) | 日本語訳 | 意味 |
---|---|---|
MachinePolicy | コンピューター ポリシー | グループポリシー (Group Policy) によって設定され、PC 全体のすべてのユーザーに影響する。通常は企業や学校の IT 管理者によって配布される。 |
UserPolicy | ユーザー ポリシー | グループポリシー (Group Policy) によって設定され、現在のユーザーのみに影響する。 |
Process | プロセス範囲 | 現在の PowerShell セッション(このウィンドウを開いている間だけ)に有効。ウィンドウを閉じると無効になる。 |
CurrentUser | 現在のユーザー | 自分のユーザー アカウントのみに影響。他のユーザーには影響せず、管理者権限も不要。 |
LocalMachine | ローカル コンピューター | PC 全体のすべてのユーザーに影響。変更には管理者権限が必要。 |
個人の権限(ユーザー単位の実行ポリシー)を変更することができます。
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
現在のユーザーのみに適用される実行ポリシーを RemoteSigned に設定する。
これはちょっと危険です
今回のセッションに限り有効。
Set-ExecutionPolicy Bypass -Scope Process
現在の PowerShell プロセスだけで実行ポリシーを Bypass に設定する。ウィンドウを閉じると元に戻る。
PS C:\WINDOWS\system32> Set-ExecutionPolicy Bypass -Scope Process
実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトの実行を防ぐのに役立ちます。 実行ポリシーを変更すると、セキュリティ リスクが発生する可能性があります。 詳細については、https:/go.microsoft.com/fwlink/?LinkID=135170 の「about_Execution_Policies」を参照してください。
実行ポリシーを変更しますか?
[Y] はい (Y) [A] すべて はい (A) [N] いいえ (N) [L] すべて いいえ (L) [S] 中断 (S) [?] ヘルプ (既定値は“N”):Y
PS C:\WINDOWS\system32> & D:/Code/FaceAnalyse/.venv/Scripts/Activate.ps1
(.venv) PS C:\WINDOWS\system32>
これで仮想環境に入りました。
最初は『なんでこんな違いがあるの?なんで PowerShell でコマンドを使うのにこんなに面倒なんだ?』という疑問を持ちますが。でも調べてみると、実はその裏にはちゃんと大事な理由があるんだとわかりました。普段意識しないからといって、理解する必要がないわけじゃないんです。
dlib のビルド失敗
また問題が発生しました:
'-DPYTHON_EXECUTABLE=...\python.exe', ... '-A', 'x64']' returned non-zero exit status 1
ERROR: Failed building wheel for dlib
これはCMake が MSVC を呼び出す段階で失敗しているものでした。
そこで気づいたのは、
CMake だけでなく、MSVC(Microsoft C++ コンパイラ)も必要である
ということです。
Python がなぜ C++ と関係しているのか不思議に思われるかもしれませんが、実際には Python 自体は C 言語の上に構築されており、さらに Pythonに含まれる多くの外部ライブラリ(特に数値計算や機械学習分野)は C++ を基盤としています。
やはり、あらかじめ Visual Studio Installer を使って C++ 開発モジュールをインストールしておくべきだと思います。(最近はパソコンをリセットした)
自分は、まだ知らないことが多いのだと感じました。
感想
本当に長い旅でした、環境構築においては
- 対応できるバージョンの選定
- エディタやターミナルの特性の理解
- 前提条件の整備
などことを気づきました