Как установить библиотеку pygame на python 3 windows

Обновлено: 07.07.2024

Многие разработчики приходят в разработку ПО, потому что хотят создавать игры. Не все могут стать профессиональными разработчиками игр, но любой может создавать собственные игры из интереса (а может быть, и с выгодой). В этом туториале, состоящем из пяти частей, я расскажу вам, как создавать двухмерные однопользовательские игры с помощью Python 3 и замечательного фреймворка PyGame.

Мы создадим версию классической игры Breakout. Освоив этот туториал, вы будете чётко понимать, что необходимо для создания игры, познакомитесь с возможностями Pygame и напишете собственный пример игры.

Мы реализуем следующие функции и возможности:

  • простые стандартные GameObject и TextObject
  • простой стандартный Game object
  • простая стандартная кнопка
  • файл конфигурации
  • обработка событий клавиатуры и мыши
  • кирпичи, ракетка и мяч
  • управление движением ракетки
  • обработка коллизий мяча с объектами игры
  • фоновое изображение
  • звуковые эффекты
  • расширяемая система спецэффектов


Краткое введение в программирование игр

Главное в играх — перемещение пикселей на экране и издаваемый шум. Почти во всех видеоиграх есть эти элементы. В этой статье мы не будем рассматривать клиент-серверные и многопользовательские игры, для которых требуется много сетевого программирования.

Основной цикл

Основной цикл (main loop) игры выполняется и обновляет экран через фиксированные интервалы времени. Они называются частотой кадров и определяют плавность перемещения. Обычно игры обновляют экран 30-60 раз в секунду. Если частота будет меньше, то покажется, что объекты на экране дёргаются.

Внутри основного цикла есть три основных операции: обработка событий, обновление состояния игры и отрисовка текущего состояния на экране.

Обработка событий

События в игре состоят из всего, что происходит за пределами управления кода игры, но относится к выполнению игры. Например, если в Breakout игрок нажимает клавишу «стрелка влево», то игре нужно переместить ракетку влево. Стандартными событиями являются нажатия (и отжатия) клавиш, движение мыши, нажатия кнопок мыши (особенно в меню) и события таймера (например, действие спецэффекта может длиться 10 секунд).

Обновление состояния

Сердце любой игры — это её состояние: всё то, что она отслеживает и отрисовывает на экране. В случае Breakout к состоянию относятся положение всех кирпичей, позиция и скорость мяча, положение ракетки, а также жизни и очки.

Существует также вспомогательное состояние, позволяющее управлять игрой:

  • Отображается ли сейчас меню?
  • Закончена ли игра?
  • Победил ли игрок?

Отрисовка

Игре нужно отображать своё состояние на экране, в том числе отрисовывать геометрические фигуры, изображения и текст.

Игровая физика

В большинстве игр симулируется физическое окружение. В Breakout мяч отскакивает от объектов и имеет очень приблизительную систему физики твёрдого тела (если это можно так назвать).

В более сложных играх могут использоваться более изощрённые и реалистичные физические системы (особенно в 3D-играх). Стоит также отметить, что в некоторых играх, например, в карточных, физики почти нет, и это совершенно нормально.

ИИ (искусственный интеллект)

Во многих играх мы сражаемся с компьютерными противниками, или в них есть враги, пытающиеся нас убить. Часто они ведут себя в игровом мире так, как будто обладают разумом.

Например, враги преследуют игрока и знают о его местоположении. В Breakout нет никакого ИИ. Игрок сражается с холодными и твёрдыми кирпичами. Однако ИИ в играх часто очень прост и всего лишь следует простым (или сложным) правилам, обеспечивающим псевдоразумные результаты.

Воспроизведение звука

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

Фоновая музыка — это просто музыка, постоянно играющая на фоне. В некоторых играх она не используется, а в некоторых меняется на каждом уровне.

Жизни, очки и уровни

В большинстве игр игрок имеет определённое количество жизней, и когда они заканчиваются, игра завершается. Также в играх часто присутствуют очки, позволяющие понять, насколько хорошо мы играем, и дающие мотивацию к самосовершенствованию или просто хвастаться друзьям своими рекордами. Во многих играх есть уровни, которые или совершенно отличаются, или постепенно увеличивают сложность.

Знакомство с Pygame

Прежде чем приступить к реализации игры, давайте немного узнаем о Pygame, который возьмёт на себя большую часть работы.

Что такое Pygame?

Pygame — это фреймворк языка Python для программирования игр. Он создан поверх SDL и обладает всем необходимым:

  • зрелостью
  • хорошим сообществом
  • открытым исходным кодом
  • кроссплатформенностью
  • качественной документацией
  • множеством примеров игр
  • простотой изучения

Установка Pygame

Введите pip install pygame , чтобы установить фреймворк. Если вам нужно что-то ещё, то следуйте инструкциям из раздела Getting Started в Wiki проекта. Если у вас, как и у меня, macOS Sierra, то могут возникнуть проблемы. Мне удалось установить Pygame без сложностей, и код работает отлично, но окно игры никогда не появляется.

Это станет серьёзным препятствием при запуске игры. В конце концов мне пришлось запускать её в Windows внутри VirtualBox VM. Надеюсь, ко времени прочтения этой статьи проблема будет решена.

Архитектура игры

Играм нужно управлять кучей информации и выполнять почти одинаковые операции со множеством объектов. Breakout — это небольшая игра, однако попытка управлять всем в одном файле может оказаться слишком утомительной. Поэтому я решил создать файловую структуру и архитектуру, которая подойдёт и для гораздо более крупных игр.

Структура папок и файлов

Pipfile и Pipfile.lock — это современный способ управления зависимостями в Python. Папка images содержит изображения, используемые игрой (в нашей версии будет только фоновое изображение), а в папке sound_effects directory лежат короткие звуковые клипы, используемые (как можно догадаться) в качестве звуковых эффектов.

Файлы ball.py, paddle.py и brick.py содержат код, относящийся к каждому из этих объектов Breakout. Подробнее я рассмотрю их в следующих частях туториала. Файл text_object.py содержит код отображения текста на экране, а в файле background.py содержится игровая логика Breakout.

Однако существует несколько модулей, создающих произвольный «скелет» общего назначения. Определённые в них классы можно будет использовать в других играх на основе Pygame.

Класс GameObject

GameObject представляет собой визуальный объект, знающий о том, как себя рендерить, сохранять свои границы и перемещаться. В Pygame есть и класс Sprite, исполняющий похожую роль, но в этом туториале я хочу показать вам, как всё работает на низком уровне, а не полагаться слишком активно на готовую магию. Вот как выглядит класс GameObject:


GameObject предназначен для того, чтобы быть базовым классом для других объектов. Он непосредственно раскрывает множество свойств его прямоугольника self.bounds, а в своём методе update() он перемещает объект в соответствии с его текущей скоростью. Он ничего не делает в своём методе draw() , который должен быть переопределён подклассами.

Класс Game

Класс Game — это ядро игры. Он выполняется в основном цикле. В нём есть множество полезных возможностей. Давайте разберём его метод за методом.

Метод __init__() инициализирует сам Pygame, систему шрифтов и звуковой микшер. Три разных вызова нужны, так как не во всякой игре на Pygame используются все компоненты, поэтому можно контролировать подсистемы, которые мы используем, и инициализировать только нужные с соответствующими параметрами. Метод создаёт фоновое изображение, основную поверхность (на которой всё отрисовывается) и игровой таймер с правильной частотой кадров.

Элемент self.objects хранит все игровые объекты, которые должны рендериться и обновляться. Различные обработчики управляют списками функций-обработчиков, которые должны выполняться при определённых событиях.


Методы update() и draw() очень просты. Они обходят все управляемые игровые объекты и вызывают соответствующие им методы. Если два объекта накладываются друг на друга на экране, то порядок списка объектов определяет, какой из них будет рендериться первым, а остальные будут частично или полностью его перекрывать.


Метод handle_events() слушает события, генерируемые Pygame, такие как события клавиш и мыши. Для каждого события он вызывает все функции-обработчики, которые должны обрабатывать события соответствующих типов.


Наконец, метод run() выполняет основной цикл. Он выполняется до тех пор, пока элемент game_over не принимает значение True. В каждой итерации он рендерит фоновое изображение и вызывает по порядку методы handle_events() , update() и draw() .

Затем он обновляет экран, то есть записывает на физический дисплей всё содержимое, которое было отрендерено на текущей итерации. И последнее, но не менее важное — он вызывает метод clock.tick() для управления тем, когда будет вызвана следующая итерация.

Заключение

В этой части мы изучили основы программирования игр и все компоненты, участвующие в создании игр. Также мы рассмотрели сам Pygame и узнали, как его установить. Наконец, мы погрузились в архитектуру игры и изучили структуру папок, классы GameObject и Game.

Во второй части мы рассмотрим класс TextObject , используемый для рендеринга текста на экране. Мы создадим основное окно, в том числе и фоновое изображение, а затем узнаем, как отрисовывать объекты (мяч и ракетку).

Pygame – это библиотека модулей для языка Python, созданная для разработки 2D игр. Также Pygame могут называть фреймворком. В программировании понятия "библиотека" и "фреймворк" несколько разные. Но когда дело касается классификации конкретного инструмента, не все так однозначно.

В любом случае, фреймворк является более мощным по-сравнению с библиотекой, он накладывает свою специфику на особенности программирования и сферу использования продукта. С точки зрения специфики Pygame – это фреймворк. Однако его сложно назвать "мощным инструментом". По своему объему и функционалу это скорее библиотека.

Также существует понятие "игрового движка" как программной среды для разработки игр. По своему назначению Pygame можно считать игровым движком. В то же время, с точки зрения классификации программного обеспечения, Pygame является API для Питона к API библиотеки SDL.

API – это интерфейс (в основном набор функций и классов) для прикладного (часто более высокоуровневого) программирования, который предоставляет, например, та или иная библиотека. SDL – это библиотека, которая работает с мультимедийными устройствами компьютера.

В этом смысле Pygame можно сравнить с Tkinter, который через свои функции и классы предоставляет Питону доступ к графической библиотеке Tk.

Особенности разработки компьютерных игр

Игры событийно-ориентированны, также как любое приложение с графическим интерфейсом пользователя. Поэтому какие-никакие, но игры можно было бы писать с помощью Tkinter, в частности на его экземплярах холста. Но поскольку основное назначение библиотеки графического пользовательского интерфейса совсем другое, то пришлось бы изобретать велосипеды. В то время как библиотека, специально предназначенная для написания игр, уже содержит необходимые объекты, что упрощает разработку.

Например, чтобы определить, столкнулись ли два объекта, надо написать код, проверяющий совпадение координат. Это может быть непростой задачей, так как надо учесть области перекрытия, форму объектов и др. В то же время игровой движок может включать готовую функцию проверки коллизии (столкновения) с необходимыми опциями настройки.

При всем этом Pygame достаточно низкоуровневый игровой движок, если его можно так называть. Это значит, что многое в нем не остается за кадром, а дается программисту на доработку, вынуждает его понимать, как работают "шестеренки". Так в Pygame отсутствует эмуляция физических явлений. Если вам надо смоделировать движение с ускорением или по дуге, программируйте это сами, предварительно взяв из курса физики соответствующую формулу.

Игры относятся к мультимедийным приложениям. Однако, в отличие от других приложений этой группы, для них характерна сложная программная логика и нередко много математики, хотя достаточно простой, плюс эмуляция физических явлений. В играх программируется подобие искусственного интеллекта. В многопользовательской игре, хотя пользователи играют друг с другом, а не с ИИ, создаются виртуальные миры, существующие по законам, заложенным разработчиками.

В программном коде игры выделяют три основных логических блока:

Отслеживание событий, производимых пользователем и не только им.

Изменение состояний объектов, согласно произошедшим событиям.

Отображение объектов на экране, согласно их текущим состояниям.

Эти три этапа повторяются в цикле бесчисленное количество раз, пока игра запущена.

Место Pygame среди инструментов разработки игр

Популярна ли библиотека pygame, пишут ли на ней сложные игры? Хотя на Pygame есть востребованные игры, в подавляющем случае – нет. Для программирования под андроид и десктоп существуют более функциональные игровые движки.

В чем тогда преимущество Pygame? Оно в легком вхождении в отрасль и прототипировании. Pygame – небольшая библиотека. Сам Python позволяет писать короткий и ясный код. Так что это хорошее начало, чтобы познакомиться с особенностями разработки игр. Более опытными программистами Pygame может использоваться для быстрого создания прототипа игры, чтобы посмотреть, как все будет работать. После этого программа переписывается на другом языке. Другими словами, преимущество Pygame в легком обучении и быстрой разработке.

Как установить Pygame

Pygame не входит в стандартную библиотеку Python, то есть не поставляется с установочным пакетом, а требует отдельной установки. В Ubuntu и родственных дистрибутивах его можно установить с помощью pip:

Если pip не установлен, предварительно выполняем команду:

Проверить, что все установилось нормально, можно так:

Для Windows вместо 'python3' надо писать 'py'. Произойдет запуск игры aliens, включенной в модуль examples (примеры) библиотеки pygame.

Курс с примерами решений практических работ:
android-приложение, pdf-версия

Используя эти возможности, программист имеет возможность создавать простые графические приложения, в том числе и несложные игры. Возможно, вы уже обратили внимание, что библиотека PyGame не содержит физического движка и всю физику в играх приходится прописывать самостоятельно на основе уравнений физики. Также в этой библиотеке нет понятий камер и все изменения состояний на плоскости осуществляется путем простого перемещения объектов в области игрового пространства. Так что, PyGame определенно не игровой движок, но очень удобен, когда нужно быстро реализовать графическое приложение с элементарной анимацией на плоскости и некоторыми звуковыми эффектами.

Вообще, PyGame – это Python-обертка над С++ - библиотекой Simple Directmedia Layer (SDL) и имеет большое интернет-сообщество с официальным сайтом:

и подробной документацией:

С чего мы начнем и как будем изучать этот модуль? Вначале нужно понять общий принцип работы PyGame и основные возможности его функционала. А, затем, на конкретных примерах посмотреть, как это все работает. Именно с этих позиций я и буду строить наши занятия.

Установка PyGame

Первым делом нам нужно установить PyGame. Делается это очень просто. Под ОС Windows следует выполнить команду:

pip install pygame

(похожим образом происходит установка и в других ОС). Далее, непосредственно в Python, создайте новый проект и запишите две строчки:

Если они выполняются без ошибок, значит библиотека установлена и готова к работе.

Каркас приложения

Давайте теперь реализуем простейшее минимальное приложение на PyGame. Первые две строчки у нас уже есть. Фактически, первая выполняет импорт основного модуля, а вторая импортирует массу других необходимых расширений (иначе бы нам каждый раз приходилось бы делать это вручную). То есть, мы здесь просто подключили саму библиотеку. Что дальше? Далее сформируем окно самого приложения с помощью следующей функции:

Если теперь запустить эту программу, то мы увидим окно на экране, которое тут же закроется. Почему приложение так себя ведет? Дело в том, что все три строчки были выполнены и программа попросту завершилась. Мы увидели окно, которое потом было автоматически закрыто. Чтобы оно оставалось на экране и отображало текущую графическую информацию, необходимо добавить главный цикл обработки событий:


То есть, в нашем приложении должен быть цикл, в котором постоянно просматриваются возникающие события из очереди событий, а затем, обрабатываются (другими словами, выполняются некоторые действия в зависимости от типа события).

Для реализации такого цикла можно создать «вечный» цикл, в котором будут проверяться произошедшие события и при необходимости обрабатываться. В самом простом варианте это можно сделать так:

Смотрите, здесь задан «вечный цикл» и внутри еще один цикл for, который выбирает события из очереди событий. Сама очередь – это итерируемый объект, к которому мы обращаемся с помощью конструкции pygame.event.get(). В результате переменная event будет ссылаться на текущее событие из этой очереди. Каждое событие – это объект, который содержит наборы различных свойств. В частности, все события имеют свойство type, которое мы и проверяем. Если оно равно константе pygame.QUIT, значит, пришло событие закрытия приложения. И здесь, в качестве обработчика выступает стандартная Python-функция exit, которая завершает наше приложение. Теперь, при запуске программы мы видим окно на экране, пока не закроем его. При закрытии срабатывает событие pygame.QUIT и программа завершается. Если, в качестве примера, вместо exit написать pass, то наше окно закрываться не будет, т.к. мы фактически удалили обработчик и ничего не делаем при возникновении этого события.

Однако, использовать непосредственно функцию exit() не всегда бывает удобно. Возможно, нам нужно просто завершить цикл и остановить работу PyGame, но продолжать дальнейшее выполнение программы. В этом случае можно воспользоваться функцией quit() пакета PyGame:

Но при закрытии окна мы увидим ошибку (исключение). Откуда она взялась? Это из-за того, что при остановке PyGame основной цикл продолжает работать и на следующей итерации пытается обратиться к очереди событий. Но эта команда уже не может быть выполнена, т.к. PyGame остановлен и уже не работает. Отсюда и возникает это исключение. Поэтому, мы поправим эту программу, добавим условие работы главного цикла:

Теперь все работает так, как мы этого и ожидаем. Вот так выглядит минимальный каркас приложения PyGame.

Задержка и формирование нужного FPS

Однако в такой реализации есть один существенный недостаток. Главный цикл работает слишком быстро: каждые несколько миллисекунд проверяется очередь событий. Это избыточно нагружает процессор компьютера. События так быстро не генерируются. Даже когда выполняется анимация в динамических играх (типа арканоид), вполне достаточно 60 кадров в секунду, т.е. выполнять главный цикл с частотой:

1/60 сек = 17 миллисекунд

А в статических играх, типа пасьянс, минер и т.п., достаточно 30 кадров в секунду:

1/30 сек = 34 миллисекунд

Как создать нужные задержки в главном цикле приложения? Если действовать «в лоб», то можно просто прописать эти временные величины внутри цикла while:

Но это не лучшее решение: на разных устройствах время выполнения итерации цикла будет разным (из-за разной скорости работы ЦП). Здесь задержка в 20 мс добавляется ко времени выполнения программы внутри цикла. То есть, мы не учитываем время обработки событий, а просто добавляем задержку в 20 мс. В результате цикл будет работать немного дольше. И это может негативно сказаться на игровом процессе: на одном устройстве игровой персонаж будет быстрее проходить уровень, а на другом – медленнее. Поэтому, правильнее использовать встроенный в PyGame инструмент тиков на основе класса Clock:

Здесь в методе tick указывается частота выполнения цикла за одну секунду. То есть, параметр 60 указывает выполнять цикл while 60 раз в секунду. При этом автоматически учитывается время, затраченное на выполнение других строчек кода на каждой текущей итерации и оно вычитается при формировании задержки. В результате, мы получаем время каждой итерации примерно 17 мс. И это время будет одинаковым на всех устройствах (разумеется, если оно будет способно обеспечивать такую скорость выполнения итераций цикла).

Вот эту величину (60) называют Frames Per Second (FPS) и, обычно, определяют вначале программы через переменную:

Наконец, последний штрих. Изменим заголовок окна и его иконку. Это делается с помощью вот таких двух строчек:

  • pygame.FULLSCREEN – полноэкранный режим;
  • pygame.DOUBLEBUF – двойная буферизация (рекомендуется при совместном использовании HWSURFACE или OPENGL);
  • pygame.HWSURFACE – аппаратное ускорение отрисовки (только для режима FULLSCREEN);
  • pygame.OPENGL – обработка отображений с помощью библиотеки OpenGL;
  • pygame.RESIZABLE – окно с изменяемыми размерами;
  • pygame.NOFRAME – окно без рамки и заголовка;
  • pygame.SCALED – разрешение, зависящее от размеров рабочего стола.

Например, если прописать флаг:

то окно можно будет менять в размерах. Или так:

Мы здесь сразу включаем двойную буферизацию, аппаратное ускорение и полноэкранный режим. По аналогии используются остальные флаги.

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

Видео по теме












© 2021 Частичное или полное копирование информации с данного сайта для распространения на других ресурсах, в том числе и бумажных, строго запрещено. Все тексты и изображения являются собственностью сайта


Прежде чем что-то устанавливать, давайте разберёмся, что такое пакет, чем он отличается от модуля, и как с ним работать. У слова «пакет» применительно к Python два значения.

C одной стороны, пакеты Python — это Py-приложения, дополнения или утилиты, которые можно установить из внешнего репозитория: Github, Bitbucket, Google Code или официального Python Package Index . На сервере пакеты хранятся в .zip и .tar архивах, либо в дополнительной упаковке — «яйцах» (.egg, старый формат) или «колесах» (.whl). В составе пакета, как правило, есть сценарий установки setup.py, который хранит сведения о зависимостях — других пакетах и модулях, без которых пакет работать не будет.

С другой стороны, если речь об архитектуре Python-приложения, пакет — это каталог, внутри которого файл __init__.py и, опционально, другие каталоги и файлы .py . Так большую Python-программу разбивают на пакеты и модули. Модуль — файл с исходным кодом, который можно использовать в других приложениях: как «заготовку» для будущих проектов или как часть библиотеки/фреймворка. Но к теме статьи это прямого отношения не имеет, поэтому дальше мы будем говорить только о пакетах из репозиториев.

Чтобы за секунды устанавливать пакеты со всеми зависимостями, используют менеджер пакетов pip или модуль easy_install . В большинстве случаев рекомендуется использовать pip. И только если у вас есть инфраструктура на пакетах .egg, которые pip не открывает, нужен easy_install.

Установка PIP для Python 3 и 2

Если вы используете виртуальные окружения на базе venv или virtualenv, pip уже установлен. Начиная с Python 3.4 (для Python 2 — с версии 2.7.9) pip поставляется вместе с интерпретатором. Для более ранних версий устанавливать менеджер пакетов нужно вручную. Вариантов два:

C помощью скрипта get_pip.py — быстро.

Через setuptools — кроме pip сможем использовать easy_install.

Вариант 1. Скачиваем скрипт get_pip.py и запускаем в консоли. Для этого открываем терминал через Win+R>"cmd">OK и пишем:

Остальное установщик сделает сам: если нужно, попутно установит wheel (для распаковки .whl-колес) и setuptools. Чтобы запретить инсталляцию дополнительных инструментов, можно добавить в строку ключи --no-setuptools и/или --no-wheels.

Если возникает ошибка, путь к Python не прописан в переменной среды $PATH. Нужно либо найти эту переменную в системном реестре и задать её значение, либо каждый раз указывать полный путь до python.exe, а за ним уже имя исполняемого Py-файла:

Полный путь полезен и в том случае, если у вас на компьютере несколько версий Python и вы ставите пакет для одной из них.

Вариант 2. Скачиваем архив с setuptools из PYPI и распаковываем в отдельный каталог. В терминале переходим в директорию setuptools c файлом setup.py и пишем:

python setup.py install

Обновить pip для Python в Windows можно так:
python pip install -U pip

Если это не работает, нужно добавить путь к папке с pip в $PATH.

Установка пакета в pip

Пора запустить pip в Python и начать устанавливать пакеты короткой командой из консоли:

pip install имя_пакета

При установке в Windows, перед pip нужно добавить "python -m".

Обновить пакет не сложнее:

pip install имя_пакета -U

Если у вас последняя версия пакета, но вы хотите принудительно переустановить его:

pip install --force-reinstall

Посмотреть список установленных пакетов Python можно с помощью команды:

Найти конкретный пакет по имени можно командой "pip search". О других командах можно прочесть в справке, которая выдается по команде "pip help".

Удаление пакета Python

Когда пакет больше не нужен, пишем:

pip uninstall имя_пакета

Как установить пакеты в Python без pip

Формат .egg сейчас используют не часто, поэтому pip его не поддерживает. Модуль easy_install умеет устанавливать как .egg, так и обычные пакеты, но есть у него важные минусы:

он не удаляет пакеты,

он может пытаться установить недозагруженный пакет.

Использовать easy_install можно сразу после установки setuptools. Хранится модуль в папке Scripts вашего интерпретатора. Если у вас в $PATH верно прописан путь, ставить пакеты из PYPI можно короткой командой:

Для обновления после install и перед именем пакета нужно ставить ключ -U. Откатиться до нужной версии можно так:

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

Чтобы узнать об опциях easy_install, запустим его с ключом -h:

Список пакетов, установленных через easy_install, хранится в файле easy-install.pth в директории /libs/site-packages/ вашего Python.

К счастью, удалять установленные через easy_install пакеты можно с помощью pip. Если же его нет, потребуется удалить пакет вручную и стереть сведения о нем из easy-install.pth.

Теперь вы умеете ставить и удалять пакеты для вашей версии Python.

Кстати, для тех, кто изучает Python, мы подготовили список полезных и практичных советов.

Читайте также: