Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Empat alat pengurusan dan pembinaan projek Python, disyorkan untuk pengumpulan!

Empat alat pengurusan dan pembinaan projek Python, disyorkan untuk pengumpulan!

WBOY
WBOYke hadapan
2023-04-12 22:52:051475semak imbas

Empat alat pengurusan dan pembinaan projek Python, disyorkan untuk pengumpulan!

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

  1. CookieCutter
  2. PyScaffold
  3. PyBuilder
  4. Puisi

CookieCutter Struktur direktori projek Python klasik

$ 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 Buat projek

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.

PyBuilder

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# 回答一些问题后创建所需的目录和文件

Proses pembinaan masih menggunakan perintah pyb Anda boleh menggunakan pyb -h untuk melihat bantuan, dan pyb -t untuk menyenaraikan semua tugas. Tugas PyBuilder ialah Ia ditambah sebagai pemalam, dan pemalam dikonfigurasikan dalam fail build.py.
$ tree sample
.
├── build.py
├── docs
├── pyproject.toml
├── setup.py
└── src
 ├── main
 │ ├── python
 │ └── scripts
 └── unittest
 └── python

PyBuilder juga mencipta persekitaran maya sebelum membina atau menguji Bermula dari versi 0.12.9, anda boleh lulus parameter --no-venvs untuk melangkau langkah mencipta persekitaran maya. Jika --no-venvs digunakan, kod Python akan dilaksanakan dalam persekitaran Python semasa yang menjalankan pyb, dan kebergantungan yang diperlukan perlu dipasang secara manual.
$ 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.

Kebergantungan di atas akan dipasang apabila pyb dilaksanakan untuk mencipta persekitaran maya, dan ujian serta binaan akan dijalankan di dalamnya.
@init
def set_properties(project):
 project.depends_on('boto3', '>=1.18.52')
 project.build_depends_on('mock')


Puisi


Puisi terakhir, saya rasa ini adalah binaan Python yang lebih matang dan lebih aktif Ia mempunyai fungsi pengurusan amanah yang lebih berkuasa Gunakan puisi tambah boto3 tambah dependencies, poetry show --tree memaparkan pokok dependency. Lihatlah cara memasang dan mencipta projek

Projek yang dibuatnya adalah lebih mudah daripada di atas
$ pip install poetry
$ poetry new sample

Jika anda memberikan puisi parameter --src baharu, maka sampel direktori fail sumber Ia akan diletakkan dalam direktori src, iaitu sampel/src/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!

Kenyataan:
Artikel ini dikembalikan pada:51cto.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam