はじめに
Git BASHでWindows環境の特に開発環境を管理してみたいという人向けです。
Windows環境でのPython環境で一番嫌な所はOneDriveの同期だと思います。開発フォルダーをOneDrive同期対象のディレクトリに作ってしまうと、自動に同期されて思わぬ量のファイルが同期されてしまいます。ファイル管理ではバックアップとして便利ですが、開発環境を置くと大変な目にあいます。そこで今回は、Poetryを利用した仮想環境の作り方とOneDriveの同期を避ける方法を書置きします。
自分の要件
アプリ開発や機械学習プロジェクトでは、様々はファイルをフォルダーに保存します。個人プロジェクトでは、プロジェクトファイル(例えばワードとかエクセル)はOneDriveでバックアップはありがたいです。但し、OneDriveディレクトリにPython環境を構築した場合、大量の依存ファイルの同期されますので、出来るだけ避けたいです。
WindowsのOneDriveの同期の現在
現在(10/25/2024)では、プロジェクトフォルダーを同期バックアップ排除にするには、OneDriveのアイコンをクリックして、設定->アカウント->フォルダの選択を選び、特定フォルダを除外しますが、毎回プロジェクトの為に、このフォルダを選択するのも面倒くさいです。
今回の解決方法
現在は、Poetryを利用して、仮想環境の依存ファイルフォルダーだけ、OneDrive配下ではな箇所に設定し、あとは通常どうりPoetryで管理していきます。まずPython環境からという方はここのリンクからインストールしておいてください。https://qiita.com/iptracej/items/4e9018a495d465af82b3
Poetry設定方法
想定の環境は、Windows 11, GitBash, VScodeです。Linux等で開発などをしていますので、Bashでシェルコマンドは統一しています。
ますインストールします。
curl -sSL https://install.python-poetry.org | python.exe -
.bashrcにパスを追加し、実行。
echo 'export PATH="$PATH:/c/Users/YourUsername/AppData/Roaming/Python/Scripts"' > .bashrc
source .bashrc
poetry --version
Poetryで仮想環境のディレクトリを設定。OneDriveが関与しないディレクトリを設定。
mkdir C:\Python\venvs
poetry config virtualenvs.path 'C:\\Python\venvs'
# poetry config virtualenvs.path 'C:/Python/venvs'
次に自分のプロジェクト(OneDrive配下のディレクトリ)に移動します。
cd ~ # ユーザのトップディレクトリに移動
cd OneDrive/Documents/ProjectA/Project1 # プロジェクトディレクトを指定
Poertyで依存パッケージの初期設定
poetry init # ここでインタラクティブに設定。必要に応じてpoetry addを実行
Poetryで依存パッケージ管理のみの場合、package-modeを無効化
vi pyproject.toml
# Under [tool.poetry]
package-mode = false
README.mdの作成
echo "# hw9 Project" > README.md
Poetryで依存パッケージのインストール
poetry install --no-root # ルートパッケージを除いてインストール
仮想環境の実行と停止
poetry shell #実行
exit # 停止
途中でパッケージの追加 (自動でインストール)
poetry add <your package name> # poetry add numpy
スクリプトの実行
python your_script.py
仮想環境をアクティブ化せずに直接コマンドを実行する場合は、poetry runを使用します。
poetry run python your_script.py
Poetryの動作中確認のプロンプトは、以下のスクリプトを.bashrcに追加してください。
## Define your custom base prompt with colors
PS1_BASE='\[\e[34m\]\u@\h\[\e[0m\] \[\e[33m\]\w\[\e[0m\]\$ '
# Function to update PS1 with the virtual environment name
function update_ps1() {
# Check if the shell is exiting or in a subshell (to avoid updating PS1 when exiting)
if [[ "$BASH_COMMAND" == "exit" ]]; then
return # Skip updating PS1 if 'exit' is being executed
fi
# Update the prompt based on whether the virtual environment is active
if [[ -n "$VIRTUAL_ENV" ]]; then
# Display '(poetry)' in green if a virtual environment is active
PS1='\[\e[32m\](poetry)\[\e[0m\] '"$PS1_BASE"
else
PS1="$PS1_BASE"
fi
}
# Save the original prompt
PS1_ORIG=$PS1
# Hook the function to PROMPT_COMMAND so it runs before each prompt
PROMPT_COMMAND=update_ps1
# Optionally, add a manual deactivate command for your virtual environment
function deactivate_virtualenv() {
if [[ -n "$VIRTUAL_ENV" ]]; then
deactivate # Deactivate virtual environment if active
echo "Virtual environment deactivated."
fi
}
# Optional: alias 'exit' to deactivate virtual environment first
alias exit='deactivate_virtualenv && exit'
VSCodeでのJupyterNotebookのような実行は、以下をインストールします。
poetry add ipykernel
VSCode上 Shift + Return で実行できます。
以上が設定でした。Happy Hacking!!!