Git BASHでPython仮想環境をPoetryを使って作成 - OneDriveの同期を避ける

## はじめに

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でシェルコマンドは統一しています。

ますインストールします。
```bash
curl -sSL https://install.python-poetry.org | python.exe -
```

.bashrcにパスを追加し、実行。
```bash
echo 'export PATH="$PATH:/c/Users/YourUsername/AppData/Roaming/Python/Scripts"' > .bashrc

source .bashrc
poetry --version
```

Poetryで仮想環境のディレクトリを設定。OneDriveが関与しないディレクトリを設定。
```bash
mkdir C:\Python\venvs
poetry config virtualenvs.path 'C:\\Python\venvs'
# poetry config virtualenvs.path 'C:/Python/venvs' 
```

次に自分のプロジェクト(OneDrive配下のディレクトリ)に移動します。
```bash
cd ~ # ユーザのトップディレクトリに移動
cd OneDrive/Documents/ProjectA/Project1 # プロジェクトディレクトを指定
```

Poertyで依存パッケージの初期設定
```bash
poetry init　 # ここでインタラクティブに設定。必要に応じてpoetry addを実行
```

Poetryで依存パッケージ管理のみの場合、package-modeを無効化
```bash
vi pyproject.toml 
# Under [tool.poetry]
package-mode = false
```


README.mdの作成
```bash
echo "# hw9 Project" > README.md
```

Poetryで依存パッケージのインストール
```bash 
poetry install --no-root # ルートパッケージを除いてインストール
```

仮想環境の実行と停止
```bash
poetry shell #実行
```
```bash
exit # 停止
```

途中でパッケージの追加 (自動でインストール)
```bash
poetry add <your package name> # poetry add numpy
```

スクリプトの実行

```bash
python your_script.py
```

仮想環境をアクティブ化せずに直接コマンドを実行する場合は、poetry runを使用します。

```bash
poetry run python your_script.py
```

Poetryの動作中確認のプロンプトは、以下のスクリプトを.bashrcに追加してください。
```bash
## 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'
```

プロンプトに(poetry)と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283070/635bba18-630d-914f-dac0-1f9e4f7a7480.png)

VSCodeでのJupyterNotebookのような実行は、以下をインストールします。
```bash 
poetry add ipykernel
```
VSCode上 Shift + Return で実行できます。

以上が設定でした。Happy Hacking!!!