Python tidak mempunyai alat pengurusan projek dan pembinaan standard de facto untuk sekian lama, menghasilkan pelbagai struktur projek Python dan kaedah pembinaan. Ini mungkin mencerminkan kehendak bebas Python.
Tidak seperti Java, ia telah melalui pembinaan manual awal, kepada Ant separa automatik, dan kemudian kepada Maven, yang pada asasnya adalah standard de facto. Dalam tempoh ini, Maven turut menerima cabaran daripada Gradle lain (terutamanya dipromosikan oleh projek Android), SBT (terutamanya projek Scala), Ant+Ivy, Buildr, dll., tetapi sukar untuk menggoyahkan status Maven di dunia dan yang lain hampir mengikut susun atur direktori Maven.
Kembali dalam Python, terdapat alatan pengurusan pakej seperti pip, pipenv, dan conda, tetapi tiada persetujuan mengenai susun atur direktori projek.
Banyak aspek pembinaan masih mengikut kaedah Makefile tradisional, dan kemudian tambah setup.py dan build.py untuk menggunakan kod program untuk memasang dan membina. Mengenai susun atur direktori projek, ada yang membuat templat projek, dan kemudian membuat alat untuk menggunakan templat projek.
Berikut ialah gambaran ringkas tentang penggunaan empat alatan
$ pip install cookiecutter $ cookiecutter gh:audreyr/cookiecutter-pypackage # 以 github 上的 audreyr/cookiecutter-pypackage 为模板,再回答一堆的问题生成一个 Python 项目 ...... project_name [Python Boilerplate]: sample ......
Templat projek akhir dihasilkan oleh cookiecutter Ia kelihatan seperti berikut:
$ 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
Ini mungkin rangka kerja utama struktur direktori yang lebih popular Elemen utama ialah:
$ 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
Ulangi direktori sampel dalam. projek dan letakkan Python dalam fail Sumber direktori, direktori ujian mengandungi fail ujian, serta direktori dokumen untuk dokumentasi, README.rst, dan fail persediaan lain, setup.cfg dan Makefile yang digunakan untuk membina.
Ini sebenarnya adalah struktur projek Python yang sangat klasik Binaan seterusnya menggunakan arahan make Enter dan anda akan melihat arahan yang ditakrifkan dalam fail 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
Untuk menggunakan proses binaan di atas, anda perlu memasang pakej yang sepadan, seperti tox, wheel, coverage, sphinx, flake8, semuanya boleh dipasang melalui pip. Kemudian anda boleh membuat ujian, membuat liputan, membuat dokumen, membuat dist, dsb. Antaranya, buat docs boleh menjana dokumen web yang cantik.
PyScaffold Seperti namanya, ia adalah alat yang digunakan untuk mencipta perancah untuk projek Python Pasang dan gunakan:
$ pip install pyscaffold $ putup sample
Projek Python dibuat dengan cara ini Struktur direktori adalah serupa dengan templat yang dipilih oleh cookiecutter sebelum ini, kecuali ia meletakkan fail sumber dalam direktori src dan bukannya direktori sampel.
$ 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 ialah alat yang digunakan untuk membina keseluruhan projek. tox ialah alat ujian dan binaan automatik yang mencipta persekitaran maya Python semasa proses binaan, membenarkan persekitaran yang bersih untuk ujian dan pembinaan.
tox -av boleh memaparkan semua tugas yang ditakrifkan dalam 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.
Gunakan tox -e build, tox -e docs, dsb. perintah yang hendak dilaksanakan
Apabila saya mencuba arahan tox, setiap langkah kelihatan perlahan untuk mencipta mesin maya.
Sebaik-baiknya melihat alat binaan lain PyBuilder Struktur direktori yang diciptanya sangat hampir dengan Maven >
Selepas selesai, lihat struktur direktorinya:$ 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 -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
Kebergantungan projek juga mesti ditakrifkan dalam fail build.py.
@init def set_properties(project): project.depends_on('boto3', '>=1.18.52') project.build_depends_on('mock')
Puisi
$ pip install poetry $ poetry new sample
$ tree sample sample ├── README.rst ├── pyproject.toml ├── sample │ └── __init__.py └── tests ├── __init__.py └── test_sample.py
poetry init akan menjana fail pyproject.toml dalam direktori semasa direktori perlu dilengkapkan secara manual.
Ia tidak menumpukan pada penjanaan dokumen, semakan spesifikasi kod atau liputan kod. Konfigurasi projeknya lebih terpusat, semuanya dalam fail pyproject.toml Apakah toml? Ia ialah format fail konfigurasi Tom's Obvious, Minimal Language (https://github.com/toml-lang/toml).
pyproject.toml agak serupa dengan fail package.json NodeJS. Contohnya, tambah puisi, pasang baris arahan puisi
# 往 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 依次降低,使用的难度大略也是相同的顺序
Atas ialah kandungan terperinci Empat alat pengurusan dan pembinaan projek Python, disyorkan untuk pengumpulan!. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!