オフライン環境でpython仮想環境を作りたい（Anacondaを使わない！） 

web業界はインターネットにつながるのが当たり前ですが、データ分析業務ではオフラインで分析環境を構築することが多いかと思います。しかし、個人で開発するわけでもないので、複数人で環境を共有したいし、実験用に複数に環境も持ちたい。そんなpython環境をオフラインで構築する最適手法を求めて調べてみました。gitなどでソースは共有される前提です。

この記事の通りの構成でpython環境を作れば
- install時の依存関係が怖くない
- 複数の分析者で仮想環境を共有できる
- 複数の仮想環境を作れる
というメリットのある環境が**オフライン**で構築できます

# 使う仮想環境は：venv
python用の仮想環境構築ツールはある程度選択肢があると思います。
大きく pipenv, virtualenv, pyenv, venv, anacondaなど。
しかし、Anacondaは有償/無償問題があり、業務的に使いづらいなど、一長一短あります。
結果、Windowsで運用するならvenvが良いと思います。Linuxならvirtualenvがいいと思います。正直、virtualenvもvenvもほとんど変わりないのでどっちでもいいです。

pipenv, virtualenv, pyenv, venvの差について
- https://qiita.com/KRiver1/items/c1788e616b77a9bad4dd

# フォルダ構成

```
- project_folder
    - pythonlib: .whlやtar.gzのライブラリを保存する先
    - venv: 仮想環境の構築先
    - src: スクリプトの保存先
    - pip-install-offline.bat: 後述
```

# 運用の流れ
以下project_folder内で実行する前提です。

## 1. 仮想環境の構築
venvを使うとpythonのバージョン指定ができないですが、Windowsの場合はpy.exeという便利なツールがpythonと一緒に導入されるので、これを使ってpythonのバージョンを指定してvenvを使います。

```bat:CMD.exe
REM 例 python 3.9 を指定し、仮想環境venv1を構築
py -3.9 -m venv venv\venv1
```

## 2. 起動スクリプト（activate.bat）を編集
venvの仮想環境を起動するときにはactivate.batを実行する必要がありますが、この内容が少し問題ありで、絶対パスが指定されています。
なので、gitなどで他の環境にproject_folderが移されてしまうとそのまま使うことができません。
絶対パス指定を相対パス指定にするために一か所変更します。

```bat:activate.bat
REM 11行目を以下のように変更
set VIRTUAL_ENV =%~dp0.. 
```
> ちなみに`%~dp0`でファイルのあるフォルダのパスを参照しています。`..`でその一つ上を参照する。

編集できたら

```bat:CMD.exe
venv\venv1\Scripts\activate
deactivate
```

と打って、deactivateが正常に終了することを確認してください

## 3. ライブラリをダウンロードする
ここはインターネット接続があり、できればオフライン環境と同じOS(Windows)とCPUアーキテクチャ、Pythonの環境で、ライブラリのダウンロードを行います。

### WEBで行う場合
PyPi (https://pypi.org/) で所望のライブラリを探しダウンロードします。
この方法では、依存関係のライブラリも一つ一つダウンロードする必要があるので、依存関係が多いライブラリはきついです。

### pip downloadで行う場合
OSやCPUアーキテクチャがオフライン環境とオンライン環境とで同一であれば特に難しくなく

```bat:CMD.exe
pip download -d <ダウンロード先フォルダ名> <ダウンロードしたいパッケージ名>
```
OSまたはCPUアーキテクチャがオフライン環境と異なる場合は、次のオプションを使ってください。
- OSまたはCPUアーキテクチャが異なる場合：`--platform`
- Pythonのバージョンが異なる場合：`--python-version`

詳しくはこちら　
https://pip.pypa.io/en/stable/cli/pip_download/


ダウンロードできたファイルは、そのままpythonlib内に保存すればＯＫ

## 4. pip installする
再度オフライン環境に戻って、最後にpip installします。
installするときはpythonlibに保存したファイルを使ってインストールすることを明示できればＯＫ
以下のようなコマンドを打ちます。

```bat:CMD.exe
pip install --no-index --find-links=pythonlib <パッケージ名>
```

ただ毎回長いオプションを書くのも面倒なので、次のような「pip-install-offline.bat」を作ります。

```bat:pip-install-offline.bat
@echo off
pip install --no-index --find-links=pythonlib %*
```

これを作れば

```bat:CMD.exe
pip-install-offline <パッケージ名>
```

これでインストール完了。

OSやCPU、Pythonが同じなら直接venvの仮想環境を使いまわすことができます。
異なる場合は別途requirement.txtを出力して、installし直すことをやれば良いです。

# あとがき
以前はオフラインの環境構築をAnacondaでおおよそのライブラリがインストールされるもので、あまり真剣に取り組んでいなかったですが、Anacondaが有償かされたことを受けて、真面目に取り組むことにしました。
調べた結果、意外にまとまった記事がなかったので記事にした次第です。

振り返るとかなり簡単に作れるのだなと思いました。

以下、記事作るのに書いたメモ書きです。

# memo
## pipenv
インターネット接続がある場合、pythonを含めた仮想環境の構築を行えるのでgit管理には最適だと思う。
しかし、そもそもオフラインを想定して作られたソフトウェアではない。

`pipenv install [file name]`でオフラインのファイルからインストールすること自体はできるようだが、そもそも仮想環境自体の構築

なので、installにはインターネット接続が必要なようで、wheelファイルなどを使ったオフラインインストールができない

無理に使うならば、ローカルネットワークにデータサーバを建ててそこからダウンロードする方法もある。しかし、面倒で非推奨。（https://github.com/pypa/pipenv/issues/1783）

## venv
python3.3以降は標準ライブラリなので、pythonを入れれば最初からある
ただし、pythonに導入される所以でpythonのバージョン自体は切り替えできない
→ Windowsではpy.exeを利用することで、任意のバージョンを指定して実行可能(https://www.python.jp/install/windows/venv.html)


## virtualenv
pythonごと仮想環境を作れる。anacondaに近い感覚。
仮想環境を作るときにpythonをインターネットからインストールしようとするので、仮想環境の最初の生成はインターネット接続がある環境がいる？

オフラインでのインストール
- https://stackoverflow.com/questions/20266562/using-virtualenv-on-machine-without-access-to-pypi
- https://qiita.com/manabuishiirb/items/8b38e445f21c7f0de264

## オフラインでpip
- https://qiita.com/saten/items/d2ac85947583723246bf
- `--no-index --find-links=openpyxl_src`を指定すると、通常の参照先（PyPI）を検索しないで、ローカルにある「openpyxl_srcディレクトリ」の中身だけでインストールを実行します。
    - https://gammasoft.jp/support/pip-install-error/

## pythonでの型付けの仕方
- https://future-architect.github.io/articles/20201223/