# Домашнє завдання · Віртуальні середовища і pip

> Лекція: [lecture.html](lecture.html) · Практика: [practice.ipynb](practice.ipynb) · Тест: [quiz.html](quiz.html)

Це завдання робиться **в терміналі**, а не в зошиті. Заведи для нього окрему теку — хай буде
`dz17/` — і всі команди виконуй, стоячи в ній. Кожен рівень просить зберегти щось у файл:
так у тебе лишиться власний конспект команд, до якого можна повернутися через півроку.

Інтернет тут знадобиться лише на другому рівні, і лише для одного маленького пакета.

---

## 🟢 Рівень 1 — База

Створи середовище й переконайся, що воно справді відокремлене.

1. Створи теку `dz17/`, зайди в неї, виконай `python3 -m venv .venv`.
2. **До активації** запиши у файл `sposterezhennya.md` вивід трьох команд:
   `which python3` (Windows: `where python`), `python3 -c "import sys; print(sys.prefix)"`,
   `python3 -c "import sys; print(sys.path)"`.
3. Активуй середовище. Переконайся, що в запрошенні з'явився префікс `(.venv)`.
4. **Після активації** запиши вивід тих самих трьох команд, а ще додай
   `which python` — без трійки.
5. Виконай `deactivate` і перевір `which python` ще раз.
6. Під кожним блоком напиши одне речення: що саме змінилося й **чому** —
   з посиланням на PATH.

**Зроблено, якщо:** у `sposterezhennya.md` є три блоки виводу (до, після, після `deactivate`),
у другому блоці `sys.prefix` вказує на теку `dz17/.venv`, а в поясненні названо, що
активація зсунула `PATH`, і жодного слова про «режим Python».

---

## 🟡 Рівень 2 — Плюс

Тепер справжній пакет і справжній `requirements.txt`.

1. В активованому середовищі постав будь-який маленький пакет із PyPI — наприклад
   `python-dateutil` або `requests`.
2. Виконай `pip list` і `pip show <пакет>`. Випиши у `sposterezhennya.md` рядок
   `Location` і поясни, чому там саме цей шлях.
3. Порахуй: скільки пакетів у `pip list` і скільки ти ставила руками. Поясни різницю.
4. Зроби `pip freeze > requirements.txt` і подивись на файл. Скільки в ньому рядків?
5. Створи **друге** середовище `.venv2`, активуй його й відтвори стан однією командою
   `pip install -r requirements.txt`. Порівняй `pip list` обох середовищ.
6. Створи `.gitignore` із трьома рядками з лекції.

**Зроблено, якщо:** `pip list` в обох середовищах дає однаковий набір пакетів однакових
версій, у `sposterezhennya.md` пояснено, звідки взялися зайві рядки у `freeze`
(залежності залежностей), а `.gitignore` приховує `.venv/`, `.venv2/` і `__pycache__/`.

---

## 🔴 Рівень 3 — Виклик

Відтвори конфлікт версій з інтерактиву 1 — по-справжньому, на власній машині.

1. Обери пакет, у якого є щонайменше дві помітно різні версії (підійде будь-який
   із довгою історією релізів). Подивись список версій командою
   `pip index versions <пакет>` або на сторінці пакета на PyPI.
2. Зроби два середовища: `env_stare` і `env_nove`. У перше постав **стару** версію
   через `==`, у друге — **нову**.
3. Напиши маленький скрипт `perevirka.py`, який імпортує пакет і друкує
   `пакет.__version__` та шлях `пакет.__file__`.
4. Запусти **той самий файл** двома інтерпретаторами, **без жодної активації**:
   `env_stare/bin/python perevirka.py` і `env_nove/bin/python perevirka.py`.
5. Збережи обидва виводи у `konflikt.md`. Поясни двома-трьома реченнями, чому
   один і той самий файл дав різний результат — назви `sys.prefix` і `site-packages`.
6. Додатково: спробуй поставити другу версію в **те саме** середовище й простеж, що
   зробить pip зі старою. Запиши, що він надрукував.

**Зроблено, якщо:** у `konflikt.md` є два виводи з різними номерами версій і різними шляхами
`__file__`, є пояснення через `sys.prefix`, і є доказ із пункту 6, що в одній теці
друга версія витісняє першу, а не лягає поруч.

---

## Підказки

- **Не вгадуй, який python запустився** — спитай: `which python` (Windows: `where python`).
  Один рядок відповідає на половину питань «чому воно ставиться не туди».
- **Прямий шлях замість активації.** `.venv/bin/python -m pip list` працює завжди й не
  залежить від того, що ти встигла активувати. У четвертому пункті третього рівня це
  принципово: активація там заборонена навмисно.
- **Якщо PowerShell лається `running scripts is disabled`** — це не про Python.
  Один раз виконай `Set-ExecutionPolicy -Scope CurrentUser RemoteSigned`.
- **Якщо `pip install` каже `externally-managed-environment`** — ти забула активувати
  середовище й потрапила в системний Python. Не шукай прапорців, просто активуй.
- **Перейменувала теку проєкту й усе зламалось?** Так і має бути: всередині `.venv`
  записані абсолютні шляхи. Видали теку середовища й створи заново — `requirements.txt`
  поверне все за одну команду. Це і є перевірка, що файл залежностей у тебе правильний.
- Теки `.venv` у домашню роботу не здаються. Здається `requirements.txt`, `.gitignore`
  і твої два файли з поясненнями.
