Python package yaratish va PyPI-ga yuklash bo'yicha qo'llanma

Bu maqolamizda Python paket yaratib va PyPI-ga yuklaymiz.
15th January 2025
Kirish
Python ekotizimi kuchli va kengaytiriladigan modullar to'plamini taklif qiladi. Masalan, requests
paketi HTTP so‘rovlarini yuborish jarayonini juda sodda qilish orqali minglab dasturchilarning ishini osonlashtirgan. Agar siz boshqalarga foydali bo'lishi mumkin bo'lgan funksionallikni ishlab chiqsangiz, uni paket sifatida PyPI (Python Package Index) ga yuklab, butun dunyo bilan bo'lishishingiz mumkin. Ushbu maqolada, PyPI uchun paket yaratish va uni yuklash jarayonlarini ko'rib chiqamiz.
1. Python Paketlari: Nima va Nega?
1.1 Python paketi nima?
Python paketi bu qayta foydalanish va PyPI saytiga yuklash uchun tuzilgan kodlarning yig‘indisidir. U modul va fayllardan iborat bo‘lib, boshqa dasturchilar foydalanishi uchun qulay shaklda saqlanadi.
1.2 Nega Python paketini yaratish kerak?
- Kodingizni boshqalar bilan bo'lishish.
- Kodingizni modular qilish va oson boshqarish.
- PyPI orqali global auditoriyaga erishish.
2. Paket Strukturasini Yaratish
Har qanday Python paketi uchun asosiy katalog tuzilishi quyidagicha bo‘ladi: Ushbu tuzilma Python interpreteriga paketni to'g'ri aniqlash va modul import qilish imkonini beradi. Shu bilan birga, u loyihaning tartibini saqlashga va boshqa dasturchilar uchun kodni tushunishni osonlashtiradi. Bugungi maqolada, latin-uz-converter
nomli paketni yaratishni ko‘ramiz. Paket quyidagi tuzilma bilan bo‘lishi mumkin:
my_package/
|-- latinUzConverter/ # Paket nomi bilan nomlangan papka (from latinUzConverter import ...)
| |-- __init__.py
| |-- core.py
| |-- letters.py
|-- tests/
| |-- test_core.py
|-- setup.py
|-- README.md
|-- LICENSE
2.1 Paketning asosiy fayllari
__init__.py
: Paketni Python moduli sifatida tanitadi.core.py
,letters.py
: Asosiy funksionallik. Agar paket bir nechta fayldan iborat bo‘lsa, masalan,core.py
valetters.py
, ular bir xil papkaning ichida joylashishi va bir-biriga to‘g‘ri import qilinishi kerak.setup.py
: Paketni tanitish uchun zarur bo‘lgan ma'lumotlarni saqlaydi.README.md
: Paket haqida tavsif.LICENSE
: Huquqiy foydalanish shartlari.tests/
: Paketni testlash uchun test fayllari..gitignore/
: Git'ga publishga chiqarilmaydigan fayllar ro‘yxati. Masalan, quyidagilarni .gitignorega qo‘shish tavsiya etiladi:
__pycache__/
*.pyc
*.pyo
# Package build artifacts
build/
dist/
*.egg-info/
# Virtual environment
env/
.venv/
Bir nechta fayldan iborat paketlar
Agar paket bir nechta Python fayldan iborat bo‘lsa, ular orasidagi ichki importlarni to‘g‘ri sozlash kerak. Masalan, core.py
ichidan letters.py
dagi funksiyani chaqirish uchun quyidagicha importdan foydalaniladi:
from .letters import *
3. Paket Yaratishning Asosiy Bosqichlari
3.1 Asosiy kod yozish
latinUzConverter
papkasini ichida kerakli faylarni kuchiring. Quyidagi misol oddiy UzLatinConverter loyihasini ko'ramiz qiladi:
core.py
fayli:
class LatinUzConverter:
def to_cyrillic(self, text: str) -> str:
pass
def to_latin(self, text: str) -> str:
pass
letters.py
fayli:
LATIN_TO_CYRILLIC = {...}
#etc...
3.2 setup.py
faylini yaratish
setup.py
PyPI uchun paketni sozlashda ishlatiladi. Agar paket boshqa kutubxonalarga bog'liq bo'lsa, install_requires
argumentidan foydalaning.
from setuptools import setup, find_packages
setup(
name="latinuzconverter",
version="1.0.0",
description="A package to convert latin text to cyrillic and vice versa.",
long_description=open("README.md").read(),
long_description_content_type="text/markdown",
author="DavronbekDev",
author_email="xackercoder@gmail.com",
url="https://github.com/firdavsdev//UzLatinConverterPyPI",
packages=find_packages(),
classifiers=[
"Programming Language :: Python :: 3",
"License :: OSI Approved :: MIT License",
"Operating System :: OS Independent",
],
python_requires=">=3.6",
# Paket uchun talab qilinadigan kutubxonalarni ko'rsating
# install_requires=[
# "aiohttp>=3.8.0",
# ],
)
3.3 Testlarni yozish
Sinov kodlari paket sifatini ta'minlaydi.
test_core.py
fayli:
import unittest
from latinUzConverter.core import LatinUzConverter
class TestCalculator(unittest.TestCase):
def setUp(self):
self.converter = LatinUzConverter()
def test_to_cyrillic(self):
self.assertEqual(self.converter.to_cyrillic("Salom"), "Салом")
def test_to_latin(self):
self.assertEqual(self.converter.to_latin("Салом"), "Salom")
if __name__ == "__main__":
unittest.main()
3.4 Paketni sinash
$ python -m unittest discover -s tests
4. Paketni tanitish
Paketni lokal tanitish uchun setuptools
va wheel
ni o‘rnating:
$ pip install setuptools wheel
Paketni yaratish uchun:
$ python setup.py sdist bdist_wheel
Bu amaldan so‘ng, dist/
papkasida .tar.gz
va .whl
fayllar paydo bo‘ladi.
5. Paketni PyPI-ga Yuklash
5.1 API token olish
PyPI saytida saytga ro‘yxatdan o‘ting va API token olish uchun settings'dan', API tokens olishingiz mumkin.
5.2 twine
o'rnatish
$ pip install twine
5.3 Paketni yuklash
Avtorizatsiya va yuklash:
$ twine upload dist/*
Uploading distributions to https://upload.pypi.org/legacy/
Enter your API token:
Uploading latin_uz_converter-1.0.0-py3-none-any.whl
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.3/20.3 kB • 00:00 • 5.2 MB/s
Uploading latinuzconverter-1.0.0.tar.gz
100% ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 20.3/20.3 kB • 00:00 • 12.1 MB/s
View at:
https://pypi.org/project/latinuzconverter/1.0.0/
Agar yuklash muvaffaqiyatli bo‘lsa, paket PyPI saytida mavjud bo‘ladi.
6. Github Actions bilan Avtomatlashtirish
6.1 Github Actions nima?
Github Actions CI/CD (Continuous Integration/Continuous Deployment) uchun ishlatiladi. Paketni avtomatik ravishda sinash va PyPI-ga yuklash uchun foydalanishimiz mumkin.
6.2 workflow
fayli yaratish
.github/workflows/python-package.yml
faylini yarating va quyidagi konfiguratsiyani kiriting:
name: Python Package
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build package
run: |
python setup.py sdist bdist_wheel
- name: Publish to PyPI
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }}
run: |
twine upload dist/*
6.3 API tokenni sozlash
GitHub repository sozlamalarida PYPI_API_TOKEN
nomli secret o‘rnatib, PyPI API tokenini kiriting.
(1) GitHub repository sahifasida Settings
bo‘limiga o‘ting.
(2) Secrets
bo‘limiga o‘ting.
(3) New repository secret
tugmasini bosing.
(4) Name
qismiga PYPI_API_TOKEN
nom yozing va API tokenni Value
qismiga kiriting.
(5) Add secret
tugmasini bosing.
6.4 Ishga tushirish
Main branchga push qilganingizda yoki pull request yaratganingizda, workflow avtomatik tarzda ishga tushadi va paket PyPI-ga yuklanadi. 🎉
7. Advanced Maslahatlar
7.1 Virtual Environment-dan foydalanish
Paketni turli Python versiyalari bilan sinash uchun virtual environmentlardan foydalaning:
$ python -m venv env
$ source env/bin/activate
7.3 tox
bilan ko‘p platformada sinash
tox
yordamida paketni bir necha Python versiyalari uchun sinang:
[tox]
envlist = py36, py37, py38, py39
[testenv]
deps =
pytest
commands =
pytest
Ishga tushirish:
$ tox
- TOX haqida batafsil ma'lumot uchun tox
7.4 paket versiyasini yangilash
Agar siz paketda yangilash qilganizda, setup.py
faylida versiya raqamlarini yangilshni unutmang:
setup(
name="latinuzconverter",
version="1.0.1",
# etc...
)
dist
papkasini tozalang va yangi distributiv fayl yarating:
$ rm -rf dist/
$ python setup.py sdist bdist_wheel
twine
yordamida yangilangan versiyani yuklang:
$ twine upload dist/*
8. Xulosa
Ushbu maqola orqali PyPI uchun paket yaratish va uni PyPI saytiga yuklash jarayonlarini ko'rib chiqdik. To'g'ri tuzilgan paket dasturchilar uchun juda foydali bo'lishi mumkin.