Python venvの利便性をDropboxディレクトリでも引き出す工夫

Python venvの利便性をDropboxディレクトリでも引き出す工夫
Page content

Pythonの仮想環境を含むディレクトリを、Dropboxを使って複数マシン間 (macOS, Linux etc.) で同期している場合に、役立つかもしれないメモです。

Dropboxディレクトリでvenvすると同期が

Pythonの仮想環境 (venv) を含むディレクトリを、Dropboxで特に特別扱いせずに同期すると、Dropboxの同期動作が遅くなることに気づきます。これはなぜなら、仮想環境には多数のファイルが存在するためです。さらに、Pythonの仮想環境の中身はPythonのバージョンやCPUアーキテクチャ (arm64, amd64 etc.) によって異なる可能性があり、これらは複数マシン間で同期せずに、各々のマシン専用のディレクトリとしておくほうが都合が良いはずです。

ということで、CLI上でPythonの仮想環境 (venv) を扱う際に、無意識的に、仮想環境を含むディレクトリをDropboxの同期対象外にする一つの方法をメモしておきます。

Step-1. venv用alias定義でひと工夫する

私の場合はmacOSでもLinuxでもシェルとしてbashを利用しているので、.bash_aliasesに次のような変数とaliasを定義しています。

## OSの種類を特定
if [ "$(uname)" == 'Darwin' ]; then
	OS='Mac'
elif [ "$(uname -o)" == 'Android' ]; then
	OS='Android'
elif [ "$(expr substr $(uname -s) 1 5)" == 'Linux' ]; then
	OS='Linux'
else
	OS='unknown'
fi

## Python venv関係のaliasを設定
if [ ${OS} = 'Mac' ]; then
	alias venv-make='python3 -m venv venv && xattr -w com.dropbox.ignored 1 venv'
	alias venv-in='source venv/bin/activate'
	alias venv-out='deactivate'
elif [ ${OS} = 'Linux' ]; then
	alias venv-make='python3 -m venv venv && attr -s com.dropbox.ignored -V 1 venv'
	alias venv-in='source venv/bin/activate'
	alias venv-out='deactivate'
fi

alias venv-makeの右辺で用いている、OSごとのxattr, attrコマンドが今回の味噌です。Dropboxサイトの次のページを参考にしています。

Step-2. 定義したaliasを用いてvenvを扱う

Pythonのプログラム開発を仮想環境を用いて行う際には、次の手順で進めます。Dropboxの同期に関する拡張属性を変更するコマンドの、OSごとの違いはalias定義で吸収しているので、Dropboxの同期対象外にしたvenvを扱う手順はmacOSとLinuxとで共通化できます。

## 移動する
cd /path/to/python-project

## (初回のみ) 仮想環境用のvenvディレクトリを作成し、かつそれをDropboxの同期対象外に設定する
venv-make

## 仮想環境に入る
venv-in

## 仮想環境へモジュールをインストールする
pip install -r ./requirements.txt

## Pythonスクリプトを実行したりデバッグしたり
python ./foobar.py
vim ./foobar.py

## 仮想環境から出る
venv-out