sys — sys.argv, sys.path, sys.exit()

~10 daq · Python · Modullar va Standart kutubxona

Muammodan boshlaylik

Rasm hajmini kichraytiruvchi skript yozdingiz. Har safar boshqa faylni qayta ishlash uchun kodni ochib, fayl nomini o'zgartirasiz:

FAYL = "rasm1.jpg"     # har safar qo'lda o'zgartirish

Kerak: terminaldan to'g'ridan-to'g'ri:

python kichraytir.py rasm1.jpg 800

Va xato bo'lsa — skript "xato bilan tugadim" degan signalni boshqa dasturlarga (CI, cron, boshqa skript) berishi kerak.


sys nima?

sys — Python interpretatorining o'zi bilan ishlash moduli: buyruq qatori argumentlari, modul qidiruv yo'llari, standart kirish/chiqish, dasturdan chiqish, versiya.

import sys

Hayotiy o'xshatma

Mashinaning boshqaruv paneli. Rul va pedallar (oddiy kod) — yo'lda harakat uchun. Panel (sys) esa mashinaning o'zi haqida: dvigatel versiyasi, yoqilg'i darajasi, "kalitni burab o'chirish" (exit), haydovchi kiritgan manzil (argv).


sys.argv — buyruq qatori argumentlari

# salom.py
import sys

print(sys.argv)
python salom.py Lola 20 --tez
['salom.py', 'Lola', '20', '--tez']
  • sys.argv[0] — skript nomi
  • Qolganlari — probel bilan ajratilgan argumentlar, hammasi string
# kichraytir.py
import sys

if len(sys.argv) != 3:
    print("Ishlatish: python kichraytir.py <fayl> <kenglik>")
    sys.exit(1)

fayl = sys.argv[1]
kenglik = int(sys.argv[2])
print(f"{fayl} → {kenglik}px")

Probelli argument — qo'shtirnoqda: python skript.py "Mening rasmim.jpg" 800.

argparse — jiddiy CLI uchun

sys.argv ni qo'lda tahlil qilish tez murakkablashadi. Standart kutubxonadagi argparse — yordam xabari, turlar, standart qiymatlar va xatolarni o'zi boshqaradi:

import argparse

parser = argparse.ArgumentParser(description="Rasmni kichraytirish")
parser.add_argument("fayl", help="Kirish fayli")
parser.add_argument("kenglik", type=int, help="Yangi kenglik, piksel")
parser.add_argument("-s", "--sifat", type=int, default=85, help="JPEG sifati (standart 85)")
parser.add_argument("--ustidan", action="store_true", help="Asl faylni almashtirish")

args = parser.parse_args()
print(args.fayl, args.kenglik, args.sifat, args.ustidan)
python kichraytir.py rasm.jpg 800 --sifat 70
python kichraytir.py --help
usage: kichraytir.py [-h] [-s SIFAT] [--ustidan] fayl kenglik

Rasmni kichraytirish

positional arguments:
  fayl                  Kirish fayli
  kenglik               Yangi kenglik, piksel
...

[!TIP] Bir-ikki oddiy argument — sys.argv yetarli. Ixtiyoriy parametrlar, bayroqlar (--tez) va yordam xabari kerak bo'lsa — argparse (yoki tashqi typer/click kutubxonalari).


sys.exit() — dasturdan chiqish

import sys

def main():
    if not tekshir():
        print("Sozlama xatosi", file=sys.stderr)
        sys.exit(1)
    ishla()
    sys.exit(0)

Chiqish kodi — operatsion tizimga dastur qanday tugaganini bildiradi:

Kod Ma'nosi
0 Muvaffaqiyatli
1 (va boshqa noldan farqli) Xato
2 Odatda — noto'g'ri argumentlar (argparse shuni qaytaradi)
python skript.py && echo "Muvaffaqiyatli"     # faqat kod 0 bo'lsa
echo $?                                       # oxirgi kod (Linux/macOS)

CI, cron, Docker va boshqa skriptlar aynan shu kodga qarab "muvaffaqiyatli bo'ldimi?" deb hal qiladi.

sys.exit("Xato: fayl topilmadi")   # string — stderr ga chiqadi va kod 1

[!INFO] sys.exit() aslida SystemExit xatosini tashlaydi — shuning uchun finally bloklari va with tozalashlari bajariladi. Lekin except Exception uni ushlamaydi (SystemExit — BaseException dan, 32-dars), yalang'och except: esa — ushlaydi va dastur chiqmay qoladi.


stdin, stdout, stderr

import sys

print("Natija")                         # stdout
print("Ogohlantirish!", file=sys.stderr)  # stderr — xatolar uchun

for qator in sys.stdin:                 # kiruvchi oqimni o'qish
    print(qator.upper(), end="")
cat ismlar.txt | python katta_harf.py > natija.txt
python skript.py 2> xatolar.log
  • stdout — asosiy natija (boshqa dasturga uzatiladi yoki faylga yo'naltiriladi)
  • stderr — xatolar va xabarlar (natija bilan aralashmasin)
  • stdin — kiruvchi ma'lumot (| orqali)

sys.path — modul qidiruv yo'llari

import sys

for p in sys.path:
    print(p)

Python import da modulni shu ro'yxatdagi papkalardan qidiradi (37-dars).

sys.path.append("/opt/mening_kutubxonam")    # vaqtincha qo'shish

[!WARNING] sys.path.append — vaqtinchalik yamoq. Loyihada modullar topilmasa, sababini tuzating: to'g'ri papkadan ishga tushiring (python -m paket.modul), paketni pip install -e . bilan o'rnating yoki loyiha tuzilmasini qayta ko'rib chiqing.


Boshqa foydali narsalar

import sys

sys.version             # '3.13.1 (main, ...)'
sys.version_info        # (major=3, minor=13, ...)
sys.platform            # 'win32', 'linux', 'darwin'
sys.executable          # ishlatilayotgan python yo'li (qaysi venv — 38-dars)
sys.getsizeof([1, 2])   # ob'ekt hajmi, baytlarda
sys.getrecursionlimit() # 1000 (22-dars)

if sys.version_info < (3, 10):
    sys.exit("Python 3.10 yoki yangisi kerak")

if sys.platform == "win32":
    print("Windows")

Amaliy misol — fayllarni birlashtirish

# birlashtir.py
import sys
from pathlib import Path

def main(argumentlar):
    if len(argumentlar) < 2:
        print("Ishlatish: python birlashtir.py <natija> <fayl1> [fayl2 ...]", file=sys.stderr)
        return 2

    natija, *fayllar = argumentlar
    xatolar = 0

    with open(natija, "w", encoding="utf-8") as chiqish:
        for nom in fayllar:
            p = Path(nom)
            if not p.is_file():
                print(f"O'tkazib yuborildi (topilmadi): {nom}", file=sys.stderr)
                xatolar += 1
                continue
            chiqish.write(p.read_text(encoding="utf-8"))
            chiqish.write("\n")

    print(f"{len(fayllar) - xatolar} ta fayl birlashtirildi → {natija}")
    return 1 if xatolar else 0

if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))

main() argumentlarni parametr sifatida oladi va kod qaytaradi — uni test qilish oson; sys.exit faqat eng yuqorida.


Tez-tez uchraydigan xatolar

argv ni son deb ishlatish:

kenglik = sys.argv[2] * 2     # ❌ "800800" — string
kenglik = int(sys.argv[2])    # ✅

Argument sonini tekshirmaslik — IndexError: list index out of range.

Xatoda ham 0 kod bilan chiqish — CI "muvaffaqiyatli" deb o'ylaydi.


Xulosa

sys — interpretator va dastur muhiti bilan ishlash.

Eslab qoling:

  • sys.argv — [skript, arg1, ...], hammasi string; murakkab CLI — argparse
  • sys.exit(0) — muvaffaqiyat, sys.exit(1) — xato; kod CI va skriptlar uchun muhim
  • print(..., file=sys.stderr) — xatolar; sys.stdin — kiruvchi oqim
  • sys.path — modul qidiruv yo'llari; append — faqat vaqtinchalik
  • sys.version_info, sys.platform, sys.executable
  • main(argv) -> kod + sys.exit(main(sys.argv[1:]))

Keyingi dars

41-dars: datetime — date, time, datetime, timedelta, strftime