IlmHamroh
Python kursi/Muhit va vositalar3/9-dars14 daqiqa
Mundarija (22)

2.3-dars: PATH nima va nega muammo beradi

2-QISM — MUHIT VA VOSITALAR · 3-dars


1. Kirish va motivatsiya

Bu darsni o'tkazib yuborish vasvasasi katta. "PATH — shunchaki papkalar ro'yxati, tushundim, davom etaylik."

Lekin statistika boshqacha gapiradi. Boshlovchi dasturchilar Stack Overflow'da so'raydigan savollarning eng ko'p uchraydigan turkumi — muhit muammolari. Va ularning aksariyati bitta ildizga borib taqaladi: PATH.

text
'python' is not recognized
'pip' is not recognized
command not found: python3
Bu men o'rnatgan versiya emas!
pip install qildim, lekin import ishlamayapti

Beshtasi ham — PATH.

1.8-darsda PATH bilan tanishdik: OT dasturlarni shu ro'yxatdan qidiradi. Bu darsda undan ancha uzoqroqqa boramiz:

  • PATH qanday tuzilgan va u qayerdan keladi
  • uni doimiy o'zgartirish (Windows va Unix'da)
  • nega o'zgartirish darhol ishlamaydi
  • where / which bilan tashxis qo'yish
  • va eng muhimi: PATH ni umuman tegmasdan ko'p muammoni chetlab o'tish usuli

Bu dars — muammolarga qarshi emlash. Bir marta tushunsangiz, umr bo'yi vaqt tejaysiz.


2. Nazariya — chuqur tushuntirish

2.1. PATH aslida nima

PATH — bu muhit o'zgaruvchisi (environment variable). Muhit o'zgaruvchilari — operatsion tizim har bir jarayonga beradigan nom-qiymat juftliklari.

PATH ning qiymati — ajratgich bilan bo'lingan papkalar ro'yxati:

Windows (ajratgich — nuqtali vergul ;):

text
C:\Windows\system32;C:\Windows;C:\Users\Siz\...\Python312\;C:\Users\Siz\...\Python312\Scripts\

macOS / Linux (ajratgich — ikki nuqta :):

text
/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

Terminalda python deb yozganingizda OT quyidagini qiladi:

text
1. "python" da yo'l belgisi (/ yoki \) bormi?
   HA  → aynan shu yo'ldan izla, PATH ga qaramaydi
   YO'Q → 2-qadam

2. PATH dagi 1-papkani ol → ichida "python" bormi?
   HA  → ishga tushir, TO'XTA
   YO'Q → keyingi papkaga o't

3. Papkalar tugadi → "command not found"

Uchta muhim xulosa:

  1. Tartib muhim. Birinchi topilgan g'olib. Ikkinchisi hech qachon ishlamaydi.
  2. Qidiruv rekursiv emas. Faqat papkaning o'zida qaraydi, ichki papkalarga kirmaydi.
  3. Yo'l ko'rsatilsa, PATH chetlab o'tiladi. ./main.py yoki /usr/bin/python3 — to'g'ridan-to'g'ri.

2.2. PATH qayerdan keladi

PATH o'z-o'zidan paydo bo'lmaydi. U bir necha manbadan yig'iladi.

Windows

Ikki daraja bor:

Daraja Qayerda Kimga ta'sir qiladi
Tizim (System) Registry: HKLM\...\Environment Barcha foydalanuvchiga
Foydalanuvchi (User) Registry: HKCU\Environment Faqat sizga

Yakuniy PATH = Tizim PATH + Foydalanuvchi PATH (shu tartibda).

Muhim natija: tizim PATH da python bo'lsa, foydalanuvchi PATH dagisiga navbat kelmaydi.

macOS / Linux

PATH qobiq (shell) sozlama fayllarida quriladi:

Qobiq Fayl Qachon o'qiladi
bash ~/.bashrc Har interaktiv terminal ochilganda
bash ~/.bash_profile Login qilganda
zsh (macOS sukut) ~/.zshrc Har interaktiv terminal ochilganda
barchasi /etc/profile, /etc/paths Tizim darajasida

Odatiy yozuv:

bash
export PATH="/yangi/papka:$PATH"

$PATH — eski qiymat. Yangi papkani oldiga qo'yish uni ustuvor qiladi, oxiriga qo'yish — zaxira qiladi:

bash
export PATH="/yangi:$PATH"     # oldin qidiriladi — ustuvor
export PATH="$PATH:/yangi"     # oxirida qidiriladi — zaxira

2.3. Nega o'zgartirish darhol ishlamaydi

Bu — eng chalkashtiradigan jihat.

PATH ni Windows sozlamalarida o'zgartirdingiz. Ochiq turgan terminalda python yozdingiz. Baribir not recognized.

Sabab: muhit o'zgaruvchilari jarayonga u boshlanayotganda nusxalanadi. Keyin ular o'sha jarayonning shaxsiy nusxasi bo'lib qoladi.

text
Windows registrida PATH o'zgardi
        │
        │  (ochiq terminalga TA'SIR QILMAYDI)
        ↓
Yangi terminal ochildi
        │
        │  registrdan PATH ning YANGI nusxasini oldi
        ↓
Endi python topiladi

1.8-darsdagi 5-bosqichni eslang: OT jarayon yaratganda unga muhitni uzatadi. Bu — bir martalik uzatish, doimiy bog'lanish emas.

Amaliy qoida: PATH ni o'zgartirgandan keyin:

  • Windows: terminalni yoping va yangidan oching. VS Code'ni ham butunlay yopib qayta oching
  • Unix: source ~/.zshrc yoki yangi terminal

Unix'dagi qo'shimcha tuzoq: bash va zsh topilgan buyruqlarni keshlaydi. PATH to'g'ri bo'lsa ham eski javob qaytishi mumkin:

bash
hash -r          # keshni tozalash

2.4. Windows: PATH ni qo'lda o'zgartirish

Grafik usul (tavsiya etiladi)

text
1. Win tugmasi → "environment" deb yozing
2. "Edit the system environment variables" ni tanlang
3. "Environment Variables..." tugmasi
4. Yuqoridagi ro'yxatda (User variables) "Path" ni tanlang → Edit
5. "New" → papka yo'lini yozing
6. Kerak bo'lsa "Move Up" bilan tartibni o'zgartiring
7. OK → OK → OK
8. Terminalni YANGIDAN oching

Python uchun ikkita yo'l qo'shiladi:

text
C:\Users\Siz\AppData\Local\Programs\Python\Python312\
C:\Users\Siz\AppData\Local\Programs\Python\Python312\Scripts\

Ikkinchisi (Scripts\) — pip, black, ruff kabi vositalar shu yerda. Uni unutish — keng tarqalgan xato.

Yo'lni qanday bilish?

text
py -c "import sys; print(sys.prefix)"

Bu asosiy papkani beradi. Scripts\ — uning ichida.

Vaqtinchalik o'zgartirish (faqat shu terminal uchun, sinash uchun qulay):

text
set PATH=C:\yangi\papka;%PATH%

Terminal yopilganda yo'qoladi. Xavfsiz sinov usuli.

2.5. macOS / Linux: PATH ni qo'lda o'zgartirish

1-qadam: qaysi qobiq ishlayotganini bilish

bash
echo $SHELL
text
/bin/zsh        → ~/.zshrc
/bin/bash       → ~/.bashrc

2-qadam: faylga qo'shish

bash
# zsh
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc

# bash
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc

>> — faylning oxiriga qo'shish. Bitta > yozsangiz butun faylni o'chirib yuborasiz. Diqqat.

3-qadam: tekshirish

bash
echo $PATH | tr ':' '\n'

~/.local/bin nima? pip install --user bilan o'rnatilgan vositalar shu yerga tushadi. Ko'p tizimda u PATH da bo'lmaydi va natijada:

text
WARNING: The script black is installed in '/home/siz/.local/bin'
which is not on PATH.

Yuqoridagi buyruq aynan shuni tuzatadi.

2.6. Tashxis: qaysi dastur ishlayapti

Windows

text
where python
text
C:\Users\Siz\AppData\Local\Programs\Python\Python312\python.exe
C:\Users\Siz\AppData\Local\Microsoft\WindowsApps\python.exe

Ikkita! Birinchisi ishlaydi. Ikkinchisi — Store taxallusi (2.1-darsdagi tuzoq).

macOS / Linux

bash
which python3          # birinchi topilganini
which -a python3       # BARCHASINI
type -a python3        # taxallus va funksiyalarni ham

type -a which dan kuchliroq — u qobiq taxalluslarini (alias) ham ko'rsatadi:

text
python3 is an alias for python3.12
python3 is /opt/homebrew/bin/python3
python3 is /usr/bin/python3

Har ikkala tizimda ishlaydigan universal usul:

text
py -c "import sys; print(sys.executable)"       # Windows
python3 -c "import sys; print(sys.executable)"  # Unix

Bu — eng ishonchli javob, chunki uni Pythonning o'zi aytyapti.

2.7. pip install ishladi, lekin import ishlamaydi

Bu — chalkashtiradigan klassik holat va u to'g'ridan-to'g'ri PATH bilan bog'liq.

text
$ pip install requests
Successfully installed requests-2.32.3

$ python main.py
ModuleNotFoundError: No module named 'requests'

Sabab: pip va python — turli Pythonlarga tegishli.

text
pip     →  /usr/local/bin/pip      →  Python 3.11 ga tegishli
python  →  /usr/bin/python3        →  Python 3.9

pip 3.11 ga o'rnatdi, python 3.9 da qidiryapti. Topilmaydi.

Tashxis:

bash
which pip
which python3
python3 -m pip --version

Oxirgi buyruq javobidagi yo'l which pip javobiga mos kelmasa — muammo shu.

Yechim — universal qoida:

bash
python3 -m pip install requests     # Unix
py -m pip install requests          # Windows

-m "shu Pythonning moduli sifatida ishga tushir" degani. Shunda pip va python doim bir xil bo'ladi.

Bu — kursning eng foydali amaliy maslahatlaridan biri. Odat qiling: pip emas, python -m pip.

2.8. PATH ni umuman tegmasdan ishlash

Eng yaxshi PATH muammosi — umuman yuz bermagani. Uchta usul:

1. Windows'da py ishlating

py.exe C:\Windows\ da turadi, u yer esa PATH da doim bor. Python PATH ga qo'shilmagan bo'lsa ham py ishlaydi.

2. Har doim -m orqali chaqiring

text
py -m pip install ...
py -m venv muhit
python3 -m http.server

Scripts\ yoki bin/ PATH da bo'lmasa ham ishlaydi.

3. Virtual muhit ishlating

bash
python3 -m venv muhit
source muhit/bin/activate      # Unix
muhit\Scripts\activate         # Windows

activate nima qiladi? U PATH ning boshiga muhit papkasini qo'shadi:

text
Faollashtirishdan oldin:
  /usr/bin:/bin

Keyin:
  /loyiha/muhit/bin:/usr/bin:/bin
   └────────────────┘ yangi, birinchi

Endi python, pip — hammasi muhitniki. deactivate eski PATH ni qaytaradi.

venv — sehr emas, u shunchaki PATH ni boshqaradi. Shuning uchun bu dars uni tushunishga kalit beradi.


3. Tez ma'lumotnoma

Ko'rish

text
Windows:  echo %PATH%          yoki    $env:PATH   (PowerShell)
Unix:     echo $PATH | tr ':' '\n'

Tashxis

text
Windows:  where python
Unix:     which -a python3  /  type -a python3
Har ikkala: python3 -c "import sys; print(sys.executable)"

Vaqtinchalik qo'shish

text
Windows:  set PATH=C:\yangi;%PATH%
Unix:     export PATH="/yangi:$PATH"

Doimiy qo'shish

text
Windows:  Win → "environment" → Edit → Path → New
Unix:     echo 'export PATH="/yangi:$PATH"' >> ~/.zshrc  &&  source ~/.zshrc

Oltin qoidalar

text
1. O'zgartirgach — terminalni YANGIDAN oching
2. pip emas — python -m pip
3. Windows'da python emas — py
4. Loyihada — venv

4. Batafsil misollar

Misol 1 — PATH ni chiroyli ko'rish

Unix:

bash
echo $PATH | tr ':' '\n' | nl
text
     1  /opt/homebrew/bin
     2  /usr/local/bin
     3  /usr/bin
     4  /bin

nl raqamlaydi — tartibni ko'rish oson.

Windows (PowerShell):

powershell
$env:PATH -split ';'

Python bilan (ikkala tizimda ham ishlaydi):

python
import os

for i, papka in enumerate(os.environ["PATH"].split(os.pathsep), 1):
    print(f"{i:2}. {papka}")

os.pathsep — tizimga mos ajratgich (; yoki :). Bu kod har ikkala tizimda ishlaydi.

Nima ko'rsatdi: 2.1 va 2.2-bo'limlar. Tartibni ko'rish — tashxisning birinchi qadami.

Misol 2 — "pip boshqa, python boshqa" muammosini ko'rish

python
import sys
import subprocess

print("Python:", sys.executable)

# pip qaysi Pythonga tegishli?
natija = subprocess.run(
    ["pip", "--version"],
    capture_output=True,
    text=True,
)
print("pip:", natija.stdout.strip())

Natija:

text
Python: /usr/bin/python3
pip: pip 24.2 from /usr/local/lib/python3.11/site-packages/pip (python 3.11)

Muammo ko'rinib turibdi: python3 — 3.9 (/usr/bin), pip esa 3.11 ga tegishli.

Bu holda pip install requests 3.11 ga o'rnatadi, python3 main.py esa 3.9 da qidiradi va topa olmaydi.

Yechim:

bash
python3 -m pip install requests

Nima ko'rsatdi: 2.7-bo'lim. Bu — eng ko'p vaqt yeydigan chalkashlik.

Misol 3 — PATH ni Pythonning o'zidan qidirish

python
import shutil

for nom in ["python", "python3", "pip", "pip3", "git", "code"]:
    yol = shutil.which(nom)
    holat = yol if yol else "topilmadi"
    print(f"{nom:8} → {holat}")

Natija:

text
python   → topilmadi
python3  → /opt/homebrew/bin/python3
pip      → topilmadi
pip3     → /opt/homebrew/bin/pip3
git      → /usr/bin/git
code     → /usr/local/bin/code

shutil.which — which buyrug'ining Python varianti. U ikkala tizimda ham ishlaydi va skriptlarda juda foydali.

Nima ko'rsatdi: 2.6-bo'lim va 2.5-darsdagi python vs python3 farqi.

Misol 4 — venv PATH ni qanday o'zgartirishini ko'rish

bash
# Faollashtirishdan OLDIN
echo $PATH | head -c 60
text
/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
bash
python3 -m venv muhit
source muhit/bin/activate

# Faollashtirishdan KEYIN
echo $PATH | head -c 80
text
/home/siz/loyiha/muhit/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin
 └──────────────────────┘ yangi, eng oldinda
bash
which python
text
/home/siz/loyiha/muhit/bin/python
bash
deactivate
which python3
text
/opt/homebrew/bin/python3

Xulosa: venv faqat bitta ish qildi — PATH ning boshiga o'z papkasini qo'ydi. Va shu bilan barcha muammoni hal qildi.

Nima ko'rsatdi: 2.8-bo'lim. venv ning ichki mexanizmi — bu 18-qismning poydevori.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"PATH — bitta ro'yxat" Windows'da ikkita (tizim + foydalanuvchi), Unix'da bir necha fayldan yig'iladi
"PATH ni o'zgartirsam darhol ishlaydi" Faqat yangi jarayonlarda. Terminalni qayta oching
"Tartib muhim emas" Juda muhim. Birinchi topilgan g'olib, ikkinchisi hech qachon ishlamaydi
"PATH ichki papkalarni ham qaraydi" Yo'q, faqat papkaning o'zini
"pip va python doim mos" Umuman yo'q. python -m pip yozing
"venv — murakkab sehr" U shunchaki PATH ni o'zgartiradi. Shundan boshqa hech narsa
"PATH ga hamma narsani qo'shsam yaxshi" Uzun PATH sekinlashtiradi va chalkashlik keltiradi
"sudo PATH muammosini hal qiladi" Aksincha — sudo boshqa PATH ishlatadi va muammoni chuqurlashtiradi

6. Keng tarqalgan xatolar va yechimlari

1. O'zgartirdim, lekin ishlamayapti

Sabab: eski terminal eski PATH nusxasini ushlab turibdi (2.3-bo'lim).

Yechim: terminalni yangidan oching. Unix'da source ~/.zshrc va hash -r. VS Code'ni butunlay yoping va qayta oching.

2. where python ikkita yo'l ko'rsatyapti

Sabab: bir nechta Python o'rnatilgan.

Yechim: keraksizini PATH dan olib tashlang yoki keraklisini "Move Up" bilan yuqoriga ko'taring. Windows'da Store taxalluslarini o'chiring (2.1-dars).

3. The script X is installed in ... which is not on PATH

Sabab: pip install --user ~/.local/bin yoki Scripts\ ga o'rnatdi, u PATH da yo'q.

Yechim: o'sha papkani PATH ga qo'shing (2.4/2.5-bo'lim). Yoki python -m X bilan chaqiring.

4. ~/.zshrc ni tahrirlab, terminalni buzib qo'ydim

Sabab: > o'rniga >> yozish kerak edi, yoki $PATH ni unutdingiz:

bash
export PATH="/yangi"        # XATO — hamma narsa yo'qoladi
export PATH="/yangi:$PATH"  # TO'G'RI

Yechim: terminal ochiq bo'lsa, vaqtincha tiklang:

bash
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"

Keyin faylni tuzating.

5. sudo python boshqa versiyani ishlatyapti

Sabab: sudo xavfsizlik uchun PATH ni tozalaydi (secure_path).

Yechim: to'liq yo'l bering — sudo /usr/bin/python3 .... Yoki umuman sudo ishlatmang (2.2-dars).

6. VS Code terminali boshqa Pythonni ko'rsatyapti

Sabab: VS Code ishga tushganda PATH nusxasini olgan, keyin siz uni o'zgartirgansiz.

Yechim: VS Code'ni butunlay yoping (Cmd/Ctrl+Q) va qayta oching. Faqat oynani yopish yetarli emas.


7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 2.4-dars: terminal buyruqlari — where, which, echo
  • 2.6-dars: VS Code'da interpretator tanlash — u ham PATH ga tayanadi
  • 18-qism: venv chuqur — bu darsdagi mexanizmning to'liq qo'llanishi
  • 18-qism: pipx — vositalarni izolyatsiyalab, PATH ga to'g'ri qo'shish
  • 15-qism: os.environ, shutil.which — muhit bilan koddan ishlash
  • 28-qism: Docker, CI/CD — u yerda PATH ni o'zingiz quyasiz
  • Kelajakdagi har bir muhit muammosi — birinchi tekshiriladigan narsa

8. Eng yaxshi amaliyotlar

  1. pip emas, python -m pip. Bitta odat, o'nlab muammodan xalos qiladi.

  2. Windows'da py ishlating. U PATH ga bog'liq emas.

  3. Har loyihada venv. Global PATH ga tegish ehtiyoji deyarli yo'qoladi.

  4. O'zgartirishdan oldin tashxis qo'ying. where / which -a — birinchi qadam. Ko'r-ko'rona o'zgartirish holatni yomonlashtiradi.

  5. PATH ni qisqa tuting. Har bir keraksiz papka — qidiruv sekinlashuvi va potentsial to'qnashuv.

  6. Sinovni vaqtinchalik qiling. export / set bilan sinang, ishlagach doimiy qiling.

  7. ~/.zshrc ni tahrirlashdan oldin nusxa oling:

    bash
    cp ~/.zshrc ~/.zshrc.zaxira

9. Amaliy topshiriq

Vazifa 1: O'z PATH ingizni o'rganish

Tizimingizga mos buyruqni ishlating va javob bering:

text
Windows:  echo %PATH%
Unix:     echo $PATH | tr ':' '\n' | nl
  1. Nechta papka bor?
  2. Nechtasi Pythonga tegishli?
  3. Ular ro'yxatning boshidami yoki oxirida?

Vazifa 2: Tashxis

text
Windows:  where python  &&  where pip
Unix:     which -a python3  &&  which -a pip3

Keyin:

text
Windows:  py -c "import sys; print(sys.executable)"
Unix:     python3 -c "import sys; print(sys.executable)"

Javoblar mos keldimi? Agar yo'q — nega?

Vazifa 3: pip va python mosligini tekshirish

text
Windows:  py -m pip --version
Unix:     python3 -m pip --version

Javobdagi qavs ichida versiya yoziladi: (python 3.12). U python --version bilan bir xilmi?

Vazifa 4: Vaqtinchalik o'zgartirish tajribasi

bash
# Unix
echo $PATH | head -c 40
export PATH="/tmp/sinov:$PATH"
echo $PATH | head -c 40
# Yangi terminal oching va yana tekshiring — o'zgarish bormi?

Savol: nega yangi terminalda o'zgarish yo'qoldi?

Javob

export faqat joriy jarayon va uning bolalariga ta'sir qiladi. Yangi terminal — yangi jarayon, u PATH ni sozlama faylidan qayta o'qiydi. Doimiy qilish uchun ~/.zshrc ga yozish kerak (2.5-bo'lim).

Vazifa 5: venv PATH ni qanday o'zgartirishini ko'rish

4-misoldagi tajribani takrorlang: PATH ni faollashtirishdan oldin va keyin solishtiring.

Vazifa 6: Muammo tashxisi

Do'stingiz shikoyat qilyapti:

text
$ pip install pandas
Successfully installed pandas-2.2.3

$ python analiz.py
ModuleNotFoundError: No module named 'pandas'
  1. Ehtimoliy sabab nima?
  2. Qaysi uch buyruq bilan tasdiqlaysiz?
  3. Yechim nima?
Javoblar
  1. pip va python turli Python o'rnatmalariga tegishli (2.7-bo'lim)

  2. Tasdiqlash:

    bash
    which -a python
    which -a pip
    python -m pip --version     # javobdagi versiyani solishtiring
  3. Yechim:

    bash
    python -m pip install pandas

    Yoki eng yaxshisi — virtual muhit yaratib, unda ishlash.

Nimani mustahkamlaydi: butun dars, ayniqsa 2.6, 2.7, 2.8-bo'limlar.


Xulosa

Bu darsda PATH ni chuqur o'rgandik — u qanday tuzilgan, qanday o'zgartiriladi va nega eng ko'p muammo keltiradi.

Eng muhim uch fikr:

  1. PATH — tartiblangan ro'yxat va tartib hal qiluvchi. Birinchi topilgan g'olib. Muammo bo'lsa, birinchi qilinadigan ish — where / which -a bilan tartibni ko'rish.

  2. O'zgarish faqat yangi jarayonda ko'rinadi. Terminalni qayta oching. VS Code'ni butunlay yopib oching.

  3. Eng yaxshi PATH muammosi — bo'lmagani. py, python -m pip va venv uchligi PATH ga qo'l urish ehtiyojini deyarli yo'qotadi.

Keyingi darsda terminal asoslarini o'rganamiz: cd, ls, mkdir va boshqa buyruqlar. Ular Python o'rganish uchun ham, umuman dasturchi bo'lish uchun ham majburiy ko'nikma.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
2.3-dars: PATH nima va nega muammo beradi — IlmHamroh