まずは結論から。Pythonアプリをデプロイするときはrequirements.txtを用意してサーバーに送る。requirements.txtは、そのアプリが必要とするPythonの環境が書かれている。
例えばDjangoのアプリをサーバーに送るときは、そのアプリのrequirements.txtに次を書いておく。
dj-database-url==0.5.0
Django==2.0.7
django-heroku==0.3.1
psycopg2==2.7.5
pytz==2018.5
whitenoise==3.3.1
これはどのDjangoアプリも必要とするPython環境である。サーバーはここに書かれた環境をもとに、Pythonの環境を切り替える。ここでサーバーはHerokuなどを想定している。
↑のリストはもちろん手作業で打たない。次のコマンドで自動的にrequirements.txtを作る。
pip freeze > requirements.txt
このコマンドを打つときは、カレントディレクトリ(ターミナルの現在地)をアプリのディレクトリにする。Djangoであればアプリディレクトリ直下のmanage.pyと同じ階層に置く。
ここでpip freezeはもちろん仮想環境venv内で行う。つまりこのコマンドは、あなたの仮想環境をそのままrequirements.txtにすることである。
以下はPythonアプリをはじめて作る人のためのメモ。
自分のマシンとサーバーは異なる環境を使っている
アプリを開発するときは
- 自分のマシンでアプリを作る
- そのアプリをサーバーに送る(デプロイという)
という手順をとる。開発者は「自分のマシン」をよくローカル環境と呼ぶ。ローカル環境、つまり自分のマシンはサーバーと環境が異なる。
ローカル環境はPython2系だが、サーバーはPython3系かもしれない。その逆もありうる。ローカル環境はDjangoをインストールしているが、サーバーはしていない、という可能性もある。
つまりrequirements.txtはローカル環境で使っているPythonの環境(psycopg2はバージョン2.7.5を使っている、といった情報)をサーバーに知らせる役割を持つ。
pip freeze
pip freezeをターミナルで打つと、その仮想環境で用意しているパッケージとバージョン一覧が出てくる。つまり
pip freeze > requirements.txt
はその結果をテキストにしているだけにすぎない。