ライブラリ・アプリケーションでPythonのバージョンを指定したい

やりたいこと

Pythonのプロジェクトはライブラリ・アプリケーションの2つに分けられます。

ライブラリを提供する際に「Python >= 3.6のみ動作します」というように、Pythonのバージョンを指定したいときがあります。
アプリケーションについても「Python = 3.6で実行します」と指定したいときがあります。

ライブラリにしろアプリケーションにしろ、pipenvやpoetryのようなパッケージング・依存管理ツールを利用して開発すると便利です。
ここではpipenvの利用を前提として、ライブラリ・アプリケーションそれぞれにおいてどのようにPythonのバージョンを指定すべきか考えます。

ライブラリにおいてPythonのバージョンを指定する

setup.cfgのoptions.python_requires項目で指定します。

[options]
python_requires = >= 3.6

ライブラリでは、依存パッケージをPipfileではなく、setup.cfgのoptions.install_requiresに記述します。
Pythonのバージョンも同じようにsetup.cfgに記述します。

アプリケーションにおいてPythonのバージョンを指定する

Pipfileのrequires項目で指定します。

[requires]
python_version = "3.6"

アプリケーションでは依存パッケージをPipfileに記述します。

アプリケーションの実行結果には再現性が求められます。
つまり、どの環境でも同じ実行結果が得られる必要があります。
再現性を確保するためには、依存パッケージの厳密な指定が必要です。
Pipfileに記述された依存パッケージを元に、利用される依存パッケージのバージョンがPipfile.lockに出力されます。

Pythonのバージョンについても同様にPipfileに記述します。
pipenv shellを実行することで、指定されたPythonバージョンを利用した仮想環境に入ることができます。
アプリケーションでコマンドを提供している場合は、pipenv run commandで仮想環境上でコマンドを実行できます。