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

Python package

Bu maqolamizda Python paket yaratib va PyPI-ga yuklaymiz.

15th January 2025

pythonpypipackage

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 va letters.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.pydagi 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.


🔥 Yangi maqola va postlarni o'tkazib yubormaslik uchun @DavronbekDev telegram kanalga obuna bo'ling!