Davronbek Boltayev
Barcha postlar

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

Bu maqolamizda Python paket yaratib va PyPI-ga yuklaymiz.

QisqachaPython kodingizni boshqalar pip install bilan o‘rnata oladigan paketga aylantirish
Muammo
Python kodingizni boshqalar pip install bilan o‘rnata oladigan paketga aylantirish
Yechim
Paket strukturasi, setup.py, testlar va PyPI'ga yuklash — qadam-baqadam
Stack
  • Python
  • setuptools
  • twine
  • PyPI
Daraja
Boshlang‘ich
Python package

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:

kod
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:
kod
# Python cache
__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:

python
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:

python
class LatinUzConverter:
    def to_cyrillic(self, text: str) -> str:
      pass

    def to_latin(self, text: str) -> str:
      pass

letters.py fayli:

python
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.

python
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:

python
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#

bash
$ python -m unittest discover -s tests

4. Paketni tanitish#

Paketni lokal tanitish uchun setuptools va wheel ni o‘rnating:

bash
$ pip install setuptools wheel

Paketni yaratish uchun:

bash
$ 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#

bash
$ pip install twine

5.3 Paketni yuklash#

Avtorizatsiya va yuklash:

bash
$ twine upload dist/*
shell
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:

yaml
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:

bash
$ 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:

ini
[tox]
envlist = py36, py37, py38, py39

[testenv]
deps =
    pytest
commands =
    pytest

Ishga tushirish:

bash
$ 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:

python
setup(
    name="latinuzconverter",
    version="1.0.1",
    # etc...
)

dist papkasini tozalang va yangi distributiv fayl yarating:

bash
$ rm -rf dist/
$ python setup.py sdist bdist_wheel

twine yordamida yangilangan versiyani yuklang:

bash
$ 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.

Post foydali bo‘ldimi?