Python には、長い間事実上の標準のプロジェクト管理および構築ツールがなかったため、Python プロジェクトの構造と構築方法はさまざまでした。これは Python の自由意志を反映しているのかもしれません。
Java とは異なり、最初の手動構築を経て、半自動化された Ant、そして基本的に事実上の標準である Maven に至りました。この期間中、Maven は他の Gradle (主に Android プロジェクトによって推進されている)、SBT (主に Scala プロジェクト)、Ant Ivy、Buildr などからの挑戦も受け入れましたが、世界での Maven の地位を揺るがすのは困難であり、他のプロジェクトはほとんどありませんでした。 Maven のディレクトリ レイアウトに従いました。
Python の世界には、pip、pipenv、conda などのパッケージ管理ツールがありましたが、プロジェクトのディレクトリ レイアウトについては合意されていません。
ビルドの多くの側面は従来の Makefile メソッドに従っており、setup.py と build.py を追加してプログラム コードを使用してインストールとビルドを行います。プロジェクト ディレクトリのレイアウトに関しては、プロジェクト テンプレートを作成し、そのプロジェクト テンプレートを適用するツールを作成する人もいます。
以下は 4 つのツールの使用の概要です
$ pip install cookiecutter $ cookiecutter gh:audreyr/cookiecutter-pypackage # 以 github 上的 audreyr/cookiecutter-pypackage 为模板,再回答一堆的问题生成一个 Python 项目 ...... project_name [Python Boilerplate]: sample ......
によって生成された最終プロジェクト テンプレートcookiecutter は次のとおりです これは次のようになります:
$ tree sample sample ├── AUTHORS.rst ├── CONTRIBUTING.rst ├── HISTORY.rst ├── LICENSE ├── MANIFEST.in ├── Makefile ├── README.rst ├── docs │ ├── Makefile │ ├── authors.rst │ ├── conf.py │ ├── contributing.rst │ ├── history.rst │ ├── index.rst │ ├── installation.rst │ ├── make.bat │ ├── readme.rst │ └── usage.rst ├── requirements_dev.txt ├── sample │ ├── __init__.py │ ├── cli.py │ └── sample.py ├── setup.cfg ├── setup.py ├── tests │ ├── __init__.py │ └── test_sample.py └── tox.ini 3 directories, 26 files
これはおそらく現在一般的なディレクトリ構造の主要なフレームワークです。主な要素は次のとおりです:
$ tree sample sample ├── Makefile ├── README.rst ├── docs │ └── index.rst ├── requirements.txt ├── sample │ ├── __init__.py │ └── sample.py ├── setup.cfg ├── setup.py └── tests ├── __init__.py └── test_sample.py
プロジェクトのサンプル ディレクトリに繰り返します。ソース ファイルをサンプル ディレクトリに配置し、Python ソース ファイルをテスト ディレクトリに配置します。これはテスト ファイル、ドキュメント用の docs ディレクトリ、README.rst、その他のセットアップ ファイル、setup.cfg およびビルド用の Makefile ファイルです。
これは実際には非常に古典的な Python プロジェクト構造です。次のビルドでは make コマンドが使用されます。make と入力すると、Makefile ファイルに定義されている命令が表示されます。
$ make cleanremove all build, test, coverage and Python artifacts clean-buildremove build artifacts clean-pycremove Python file artifacts clean-test remove test and coverage artifacts lint check style test run tests quickly with the default Python test-all run tests on every Python version with tox coverage check code coverage quickly with the default Python docs generate Sphinx HTML documentation, including API docs servedocscompile the docs watching for changes releasepackage and upload a release dist builds source and wheel package installinstall the package to the active Python's site-packages
上記のビルド プロセスを使用するには、tox、wheel、coverage、sphinx、flake8 などの対応するパッケージをインストールする必要があります。これらはすべて pip を通じてインストールできます。その後、テストの作成、カバレッジの作成、ドキュメントの作成、dist の作成などを行うことができます。その中でもmake docsは美しいWebドキュメントを生成することができます。
PyScaffold 名前が示すように、Python プロジェクトのスキャフォールディングを作成するために使用されるツールです。インストールして使用します:
$ pip install pyscaffold $ putup sample
このように作成します。Python プロジェクトを作成しました。ディレクトリ構造は、ソース ファイルがサンプル ディレクトリではなく src ディレクトリに配置されることを除いて、cookiecutter で選択されたテンプレートと似ています。
$ tree sample sample ├── AUTHORS.rst ├── CHANGELOG.rst ├── CONTRIBUTING.rst ├── LICENSE.txt ├── README.rst ├── docs │ ├── Makefile │ ├── _static │ ├── authors.rst │ ├── changelog.rst │ ├── conf.py │ ├── contributing.rst │ ├── index.rst │ ├── license.rst │ ├── readme.rst │ └── requirements.txt ├── pyproject.toml ├── setup.cfg ├── setup.py ├── src │ └── sample │ ├── __init__.py │ └── skeleton.py ├── tests │ ├── conftest.py │ └── test_skeleton.py └── tox.ini
プロジェクト全体で tox の使用が必要です。 tox は、ビルド プロセス中に Python 仮想環境を作成する自動テストおよびビルド ツールで、テストとビルドにクリーンな環境を実現します。
tox -av は、tox.ini で定義されているすべてのタスクを表示できます:
$ tox -av default environments: default -> Invoke pytest to run automated tests additional environments: build -> Build the package in isolation according to PEP517, see https://github.com/pypa/build clean -> Remove old distribution files and temporary build artifacts (./build and ./dist) docs-> Invoke sphinx-build to build the docs doctests-> Invoke sphinx-build to run doctests linkcheck -> Check for broken links in the documentation publish -> Publish the package you have been developing to a package index server. By default, it uses testpypi. If you really want to publish your package to be publicly accessible in PyPI, use the `-- --repository pypi` option.
実行したいコマンドに対して tox -e build、tox -e docs などを使用します。
tox コマンドを使用した経験では、すべてのステップが遅いように思えました。仮想マシンの作成には時間がかかるはずです。
別のビルド ツール PyBuilder を検討するのが最善です。作成されるディレクトリ構造は Maven に非常に似ています。見てみましょう
$ pip install pybuilder $ mkdir sample && cd sample# 项目目录需手工创建 $ pyb --start-project# 回答一些问题后创建所需的目录和文件
完了したら、ディレクトリ構造を確認してください:
$ tree sample . ├── build.py ├── docs ├── pyproject.toml ├── setup.py └── src ├── main │ ├── python │ └── scripts └── unittest └── python
ビルド プロセスでは引き続き pyb コマンドが使用されます。ヘルプを表示するには pyb -h を使用し、すべてのタスクを一覧表示するには pyb -t を使用できます。 PyBuilder のプラグインの形式は、プラグインの構成が build.py ファイルにあることを追加しました。
$ pyb -t sample Tasks found for project "sample": analyze -Execute analysis plugins. depends on tasks: prepare run_unit_tests clean - Cleans the generated output. compile_sources - Compiles source files that need compilation. depends on tasks: prepare coverage - <no description available> depends on tasks: verify install - Installs the published project. depends on tasks: package publish(optional) package - Packages the application. Package a python application. depends on tasks: compile_sources run_unit_tests(optional) prepare - Prepares the project for building. Creates target VEnvs print_module_path - Print the module path. print_scripts_path - Print the script path. publish - Publishes the project. depends on tasks: package verify(optional) coverage(optional) run_integration_tests - Runs integration tests on the packaged application. depends on tasks: package run_unit_tests - Runs all unit tests. Runs unit tests based on Python's unittest module depends on tasks: compile_sources upload - Upload a project to PyPi. verify - Verifies the project and possibly integration tests. depends on tasks: run_integration_tests(optional) $ pyb run_unit_tests sample
PyBuilder では、ビルドまたはテストの前に仮想環境も作成されます。バージョン 0.12.9 以降では、パラメーター --no-venvs を使用して仮想環境を作成する手順をスキップできます。 --no-venvs を使用すると、Python コードは pyb を実行している現在の Python 環境で実行され、必要な依存関係を手動でインストールする必要があります。
プロジェクトの依存関係も build.py ファイルで定義する必要があります。
@init def set_properties(project): project.depends_on('boto3', '>=1.18.52') project.build_depends_on('mock')
pyb を実行して仮想環境を作成すると、上記の依存関係がインストールされ、その中でテストとビルドが実行されます。
最後の Poetry は、より成熟し、よりアクティブな Python ビルドのように感じられます。より強力な信頼管理機能があります。poetry add boto3 を使用して、依存関係、poetry を追加しますshow --tree は依存関係ツリーを表示します。プロジェクトのインストールと作成方法を見てください
$ pip install poetry $ poetry new sample
作成されるプロジェクトは上記よりも簡単です
$ tree sample sample ├── README.rst ├── pyproject.toml ├── sample │ └── __init__.py └── tests ├── __init__.py └── test_sample.py
詩に --src パラメータを指定すると、ソース ファイル ディレクトリのサンプルが作成されますsrc ディレクトリ、つまり、sample/src/sample に配置されます。
poetry init は、現在のディレクトリに pyproject.toml ファイルを生成します。ディレクトリの生成は手動で完了する必要があります。
ドキュメントの生成、コード仕様のチェック、コード カバレッジには焦点を当てていません。そのプロジェクト構成はより集中化されており、すべて pyproject.toml ファイル内にあります。これは、Tom's Obvious, Minimal Language (https://github.com/toml-lang/toml) の構成ファイル形式です。
pyproject.toml は、NodeJS package.json ファイルに似ています。たとえば、詩の追加、詩のインストール コマンド ライン
# 往 pyproject.toml 中添加对boto3 的依赖并安装(add 还能从本地或 git 来安装依赖 ), poetry add boto3 # 将依照 pyproject.toml 文件中定义安装相应的依赖到当前的 Python 虚拟环境中 # 比如在 <test-venv>/lib/python3.9/site-packages 目录中,安装好模块后也可让测试用例使用 poetry install
其他主要的
1.poetry build# 构建可安装的 *.whl 和 tar.gz 文件 2.poetry shell# 会根据定义在 pyproject.toml 文件中的依赖创建并使用虚拟环境 3.poetry run pytest# 运行使用 pytest 的测试用例,如 tests/test_sample.py 4.poetry run python -m unittest tests/sample_tests.py# 运行 unittest 测试用例 5.poetry export --without-hashes --output requirements.txt# 导出 requirements.txt 文件, --dev导出含 dev 的依赖,或者用 poetry export --without-hashes > requirements.txt
poetry run 能执行任何系统命令,只是它会在它要的虚拟环境中执行。所以可以想见,poetry 的项目要生成文档或覆盖率都必须用 poetry run ... 命令来支持 sphinx, coverage 或 flake8。
在 sample 目录(与 pyproject.toml 文件平级)中创建文件 my_module.py, 内容为
def main(): print('hello poetry')
然后在 pyproject.toml 中写上。
[tool.poetry.scripts] my-script="sample.my_module:main"
再执行
$ poetry run my-script
就会输出 "hello poetry"。
通过对以上四个工具的认识,项目结构的复杂度由 cookiecutter-pyproject -> PyScaffold -> PyBuilder -> Poetry 依次降低,使用的难度大略也是相同的顺序
以上がPythonのプロジェクト管理・構築ツール4選、おすすめまとめ!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。