Структура PythonGo-проектаГлава 2.1
02 / 01 Один проект · следующий шаг

Сначала — своё окружениесвой модуль

Создаём рабочую папку, выбираем Python и разбираем, что делает активация.

Создаём рабочую папку, объявляем модуль и понимаем, где Go держит зависимости.

Результат главыstudent-tools/ + .venv/student-tools/ + go.mod
Ваш терминал
Для работы вместе с преподавателем

Зачем начинать с .venv

На одном компьютере обычно лежит несколько проектов, и разным проектам нужны разные версии библиотек. Если ставить библиотеки в общее место, проекты оказываются связаны: обновление ради первого может сломать второй.

Виртуальное окружение отделяет установленные библиотеки проекта от остальных. Каталог .venv создаётся на основе уже установленного Python: внутри будет исполняемый файл Python или ссылка на него, служебные файлы и собственные пакеты. Это не отдельная операционная система.

Проект — все файлы и папки, из которых складывается программа: исходный код, проверки, документация, настройки и список зависимостей. Наш общий проект — Student Tools. Он посчитает среднюю оценку, сначала обычным текстом, а затем с помощью Rich. В каждой главе мы изменяем эту же папку.

Схема · два независимых окружения
student-tools/.venv → свои пакеты
другой-проект/.venv → другие пакеты

Одинаковое имя папки не делает окружения общими.

01 / Откройте папку проекта

Выполните в своём проекте
Где
Finder / Проводник → распакованная папка.
Действие
Распакуйте архив → откройте папку python/ → назовите её student-tools → VS Code: File → Open Folder.
Результат
В Explorer виден корень STUDENT-TOOLS и файл main.py.
Проверка
Откройте Terminal → New Terminal. Последний каталог в пути — student-tools.
↓Скачать начало проектаZIP · внутри папки python/ и go/

Распакуйте архив и возьмите из него папку python. Переименуйте её в student-tools. В VS Code выберите File → Open Folder и откройте именно её. Слева в Explorer должен быть виден main.py. Не создавайте проект внутри папки .venv.

Откройте Terminal → New Terminal. Текущая папка терминала должна быть student-tools. Если там другое место, перейдите командой cd "путь к student-tools". В этой книге подпись над командами всегда показывает, откуда их выполнять.

02 / Создайте окружение

Выполните в своём проекте
Где
Терминал VS Code, корень student-tools.
Действие
Выберите ОС выше. Выполните проверку версии, затем команду создания ниже.
Результат
В Explorer появился каталог .venv; внутри есть pyvenv.cfg.
Проверка
Дождитесь возврата приглашения терминала. Если видна ошибка, не переходите к активации.

Нужен установленный Python 3.10 или новее. Выберите вашу систему в переключателе сверху. Первая команда проверяет Python, вторая создаёт папку окружения. Если Windows не находит py, но команда python --version работает, используйте python -m venv .venv.

-m означает «выполни модуль», venv — встроенный модуль создания окружений, последнее .venv — имя создаваемой папки. Успешная команда может ничего не напечатать: проверьте появление каталога в Explorer.

Вывод ls .venv, содержимое pyvenv.cfg и pip list с единственным пакетом pip.
Настоящее содержимое нового окружения · macOS / Python 3.12

Слева — три папки и файл pyvenv.cfg. В pyvenv.cfg записано, от какого Python создано окружение (home) и его версия. Сразу после создания в окружении установлен только сам pip: список библиотек пуст. На Windows вместо bin будет Scripts.

Скачать текст вывода ↓ · Нажмите на изображение, чтобы увеличить.

Содержимое окружения создаёт Python. Свой код туда не переносим и служебные файлы руками не редактируем. .venv — принятое имя папки; .env обычно является файлом переменных окружения. Это разные вещи.

03 / Активируйте и проверьте

Выполните в своём проекте
Где
Тот же терминал, корень student-tools.
Действие
Выполните команду активации ниже, затем проверку sys.executable.
Результат
Путь к Python содержит .venv; сравнение префиксов даёт True.
Проверка
Сопоставьте свой вывод с изображением. Ваш абсолютный путь будет другим.
Интерактивная схема · не настоящий терминал
python → базовый Python

Папка уже существует, но терминал ещё использует прежний путь поиска команд.

ТЕРМИНАЛ · student-tools/
python -c "import sys; print(sys.executable); print(sys.prefix != sys.base_prefix)"

Первой строкой должен появиться путь внутрь student-tools/.venv, второй — True. Префикс (.venv) в приглашении полезен, но путь к интерпретатору — более надёжная проверка.

Что именно делает активация

Когда вы набираете python, терминал не угадывает, какую программу запустить: он идёт по списку папок из переменной PATH — сверху вниз — и берёт первый подходящий файл. Активация не создаёт и не перемещает ничего на диске. Она делает ровно одно: ставит папку .venv в начало этого списка для текущего терминала. С этого момента первым найденным python оказывается python из вашего окружения, а вместе с ним — и его собственный pip с его набором библиотек.

Отсюда три следствия. Активация действует только в том терминале, где вы её выполнили: соседняя вкладка продолжит работать с базовым Python. Команда deactivate возвращает прежний порядок поиска, но не удаляет окружение — папка остаётся на диске со всеми пакетами. И наконец, активация вообще не обязательна: можно ничего не активировать и каждый раз вызывать интерпретатор по полному пути, как в блоке для PowerShell ниже — результат будет тот же.

Терминал: до активации команда указывает на базовый Python и печатает False, после активации — на python внутри .venv и True, после deactivate снова базовый Python и False.
Один терминал, три состояния · macOS / Python 3.12

Сверху окружение уже создано, но не активировано: команда находит базовый Python, проверка префикса даёт False. В середине после активации тот же терминал находит python внутри .venv, проверка даёт True. Снизу после deactivate всё вернулось к базовому Python, а папка .venv осталась на диске.

Нажмите на изображение, чтобы увеличить.
Вывод проверки: исполняемый Python находится в student-tools/.venv/bin/python, сравнение префиксов True.
Результат реального прогона · macOS / Python 3.12

Слева от приглашения может быть (.venv), но проверять нужно сам путь. В этом прогоне проект находится во временной папке /tmp; у вас будет собственный путь.

Скачать текст вывода ↓ · Нажмите на изображение, чтобы увеличить.

Зачем начинать с go.mod

На одном компьютере обычно лежит несколько проектов, и разным проектам нужны разные версии библиотек. Если версия выбирается «глобально», один проект придётся ломать ради другого. Go решает это иначе, чем Python: изоляцию даёт не отдельная папка внутри проекта, а файл, который лежит в его корне.

Модуль — это набор пакетов с общим именем, у которого в корне есть файл go.mod. В go.mod записано имя модуля, минимальная версия Go и точные версии всех зависимостей. Скачанный код библиотек хранится в общем кэше на вашем компьютере, но при сборке каждый проект берёт ровно те версии, которые названы в его собственном go.mod. Поэтому проекты не мешают друг другу и активировать ничего не нужно.

Проект — все файлы и папки, из которых складывается программа: исходный код, проверки, документация, настройки и список зависимостей. Наш общий проект — Student Tools. Он посчитает среднюю оценку, сначала обычным текстом, а затем цветным выводом через стороннюю библиотеку. В каждой главе мы изменяем эту же папку.

Схема · два независимых модуля
student-tools/go.mod → свои версии
другой-проект/go.mod → другие версии

Скачанный код общий, выбор версий — у каждого свой.

Если вы уже прошли ветку Python

Действия те же самые, отличаются имена файлов и команды. Слева — то, что вы делали в Python, справа — как это выглядит в Go.

В PythonВ Go
Папка .venv в проектеФайл go.mod в корне модуля
source .venv/bin/activateНе нужно: команда go сама находит go.mod
python -m pip install richgo get github.com/fatih/color
requirements.txt + pip freezego.mod и go.sum — заполняются сами
Библиотеки внутри проекта, в .venvБиблиотеки в общем кэше, версии — в go.mod
Пакет = папка с __init__.pyПакет = просто папка с .go-файлами

01 / Откройте папку проекта

Выполните в своём проекте
Где
Finder / Проводник → распакованная папка.
Действие
Распакуйте архив → откройте папку go/ → назовите её student-tools → VS Code: File → Open Folder.
Результат
В Explorer виден корень STUDENT-TOOLS и файл main.go.
Проверка
Откройте Terminal → New Terminal. Последний каталог в пути — student-tools.
↓Скачать начало проектаZIP · внутри папки python/ и go/

Распакуйте архив и возьмите из него папку go. Переименуйте её в student-tools. В VS Code выберите File → Open Folder и откройте именно её: слева в Explorer должен быть виден main.go. Открывать нужно папку самого проекта, а не папку уровнем выше — иначе команда go не найдёт go.mod.

Откройте Terminal → New Terminal. Текущая папка терминала должна быть student-tools. Если там другое место, перейдите командой cd "путь к student-tools". В этой книге подпись над командами всегда показывает, откуда их выполнять.

02 / Объявите модуль

Выполните в своём проекте
Где
Терминал VS Code, корень student-tools.
Действие
Проверьте версию Go, затем выполните go mod init с именем модуля.
Результат
В корне появился файл go.mod из двух строк.
Проверка
Откройте go.mod в редакторе. Первая строка начинается со слова module.

Нужен установленный Go 1.21 или новее. Команды одинаковы во всех операционных системах — отдельный переключатель терминала здесь не нужен.

ТЕРМИНАЛ · student-tools/
go version
go mod init example.com/student-tools

go mod init создаёт файл go.mod, а его аргумент — имя модуля. С этого имени будут начинаться все внутренние импорты проекта, поэтому оно должно быть уникальным. Обычно берут адрес будущего репозитория: github.com/ваш-логин/student-tools. Учебное example.com/student-tools тоже работает: Go не обращается по этому адресу, пока вы сами не попросите скачать такой модуль.

student-tools/go.mod
module example.com/student-tools

go 1.21

Пока в файле только две строки: имя модуля и версия Go, на которую рассчитан код. Раздела require нет — зависимостей ещё нет. Он появится сам в главе 2.3, когда мы подключим первую библиотеку.

Где тогда лежат библиотеки

Скачанные версии Go складывает в общий кэш модулей — одну папку на весь компьютер. Посмотреть её путь можно так:

ТЕРМИНАЛ · student-tools/
go env GOMODCACHE
go env GOPATH

Внутри кэша каждая библиотека лежит вместе с номером версии в имени папки, поэтому две версии одной библиотеки существуют рядом. Проекту не нужна своя копия: ему достаточно назвать нужную версию в go.mod. Править файлы в кэше вручную нельзя — Go проверяет их контрольные суммы.

03 / Проверьте, что модуль виден

Выполните в своём проекте
Где
Тот же терминал, корень student-tools.
Действие
Выполните обе команды ниже.
Результат
Первая печатает имя модуля, вторая — путь к его корню.
Проверка
Путь заканчивается на student-tools. Ваш абсолютный путь будет другим.
ТЕРМИНАЛ · student-tools/
go list -m
go env GOMOD

Если вместо имени модуля вы видите сообщение go.mod file not found in current directory or any parent directory, значит терминал находится вне проекта или go mod init не выполнялся. Перейдите в папку с go.mod и повторите.

Что происходит вместо активации

Когда вы набираете go build или go run, команда не угадывает, какой проект вы имеете в виду. Она берёт текущую папку и идёт вверх по дереву каталогов, пока не найдёт go.mod. Найденный файл и задаёт границы модуля: его имя, набор пакетов и версии зависимостей. Никакой предварительной команды для этого не требуется.

Отсюда три следствия. Работает это в любом терминале — вкладки и новые окна ничего не теряют, потому что состояние хранится в файле, а не в сессии. Дальше: вложенные папки — часть того же модуля, отдельный go.mod внутри проекта создавать не нужно, поэтому в редакторе открывают папку с go.mod. И наконец, место установки самого Go роли не играет: один и тот же go обслуживает все ваши проекты, а различает их по go.mod.

Интерактивная схема · не настоящий терминал
go build → student-tools/go.mod

Команда выполнена в корне: go.mod найден сразу, модуль определён.

Проверьте себя · Почему нельзя просто скопировать .venv одногруппнику?

В окружении есть локальные пути и платформенные файлы. На другом компьютере его создают заново из установленного Python; список библиотек передают отдельно. В главе 2.6 подготовим такой список.

Проверьте себя · Почему в Go нет команды «активировать окружение»?

Потому что окружения как папки в проекте нет. Версии зависимостей записаны в go.mod рядом с кодом, а сам код библиотек лежит в общем кэше. Команде go из любого терминала достаточно найти go.mod выше по дереву папок — выбор версий уже сделан, активировать нечего.

Документация к теме

Go: создание модуля · Go: справочник по модулям · Go: организация кода · VS Code: Go

Python: venv · Python: модули и пакеты · VS Code: Python environments · pip freeze