sys — sys.argv, sys.path, sys.exit()
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.argvyetarli. Ixtiyoriy parametrlar, bayroqlar (--tez) va yordam xabari kerak bo'lsa —argparse(yoki tashqityper/clickkutubxonalari).
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()aslidaSystemExitxatosini tashlaydi — shuning uchunfinallybloklari vawithtozalashlari bajariladi. Lekinexcept Exceptionuni ushlamaydi (SystemExit—BaseExceptiondan, 32-dars), yalang'ochexcept: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), paketnipip 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 —argparsesys.exit(0)— muvaffaqiyat,sys.exit(1)— xato; kod CI va skriptlar uchun muhimprint(..., file=sys.stderr)— xatolar;sys.stdin— kiruvchi oqimsys.path— modul qidiruv yo'llari;append— faqat vaqtinchaliksys.version_info,sys.platform,sys.executablemain(argv) -> kod+sys.exit(main(sys.argv[1:]))
Keyingi dars
41-dars: datetime — date, time, datetime, timedelta, strftime