Содержание
- Детектим виртуалки
- Определяем факт запуска приложения в VirtualBox, VMware Workstation, Virtual PC и Parallels Workstation
- Как распознать виртуальную машину?
- Анализируем оборудование
- Хакер #174. Собираем квадрокоптер
- Вспомогательные процессы, окна и другие «подозрительные» объекты
- Что еще «подозрительного» можно найти в реестре?
- Возможности, заложенные производителем
- Заключение
- Обзор 3-х популярных виртуальных машин для Windows
- Для чего используются виртуальные машины
- Oracle Virtualbox
- Некоторые настройки ВМ и гостевой системы
- VMware Workstation Pro
- Некоторые опции виртуальной машины VMware
- Microsoft Hyper-V
- Некоторые опции виртуальных машин Hyper-V
- Виртуальные машины. Как сделать компьютер в компьютере
- Содержание
- Содержание
- Что такое виртуальные машины
- Зачем нужны виртуальные машины
- Основные термины и их понимание
- Установка
- Как работает виртуальная машина
- Создаем виртуальный компьютер
- Настраиваем взаимодействие с хостом и сеть
- Проблемы с виртуализацией
- Виртуализируй это!
Детектим виртуалки
Определяем факт запуска приложения в VirtualBox, VMware Workstation, Virtual PC и Parallels Workstation
Не каждому хочется, чтобы его, кхм, новый текстовый редактор какие-нибудь неприятные дядьки исследовали под виртуальной машиной. Детект виртуалок — обязательный функционал определенного рода софта, и поэтому наша рубрика ну совершенно никак не может обойтись без обзора соответствующих способов!
Как распознать виртуальную машину?
Во-первых, любая виртуальная машина несет на своем борту какое-нибудь специфическое оборудование. Это касается видеоадаптера, жесткого диска, идентификатора процессора, версии BIOS, MAC-адреса сетевой карты.
Во-вторых, виртуальные машины оставляют следы в системе в виде запущенных вспомогательных процессов, драйверов и других специфических объектов.
В-третьих, если как следует покопаться в реестре виртуальной машины, там можно найти много всяких интересных ключей, характерных только для виртуальных машин.
Ну и в-четвертых, некоторые производители специально оставляют возможности, позволяющие обнаружить их продукты.
Что же касается общих признаков наличия виртуальной машины, предложенных в свое время госпожой Рутковской (характерное расположение таблиц IDT, GDT и LDT, а также время выполнения операций процессором), то в настоящий момент все эти признаки трудно поддаются анализу и приведению к какому-нибудь общему знаменателю, главным образом из-за многоядерности и многоликости современных процессоров.
Анализируем оборудование
Начнем, пожалуй, с жесткого диска. Если посмотреть идентификатор жесткого диска в диспетчере устройств на виртуальной машине, то в его составе можно увидеть интересные строчки:
Самый простой способ узнать наименование жесткого диска — прочитать значение ключа с именем «0» в ветке реестра HKLMHARDWARESYSTEMCurrentControlSetServicesDiskEnum.
В этом месте перечисляются все дисковые накопители в системе, и первым, как раз в ключе с именем «0», будет тот диск, с которого произошла загрузка системы.
Идентификатор жесткого диска VirtualBox в реестре
Хакер #174. Собираем квадрокоптер
Как читать реестр, я думаю, ты знаешь. Используем сначала API RegOpenKeyEx для открытия нужного ключа, далее с помощью RegQueryValueEx читаем значение. Выглядеть это должно примерно вот так:
Далее все просто — используем strstr для поиска нужных нам строк в считанном значении и, в зависимости от результата сравнения, делаем вывод. Версия BIOS содержится в ключе «SystemProductName» в ветке HKLMHARDWAREDESCRIPTIONSystemBIOS. К примеру, для VMware там будет лежать строка «VMware Virtual Platform», а для VirtualBox — «VBOX –1».
Прочитать это все можно с помощью все тех же API — RegOpenKeyEx и RegQueryValueEx.
Версия BIOS Parallels Workstation в реестре
Данные о видеоадаптере можно подглядеть в HKLMSystemCarrentControlSetEnumPCI. В этой ветке перечислено все, что подключено к шине PCI, в том числе и видеокарта. Для VirtualPC это строчка вида VEN_5333&DEV_8811&SUBSYS_00000000&REV_00, которая определяет видеоадаптер S3 Trio 32/64, эмулируемый виртуалкой от Microsoft — на реальном железе такое оборудование нынче днем с огнем не сыскать (а у меня такая была в конце прошлого века. — Прим. ред.). Для VirtualBox видеокарта описана последовательностью VEN_80EE&DEV_BEEF&SUBSYS_00000000&REV_00, что расшифровывается как «VirtualBox Display», а у Parallels Workstation — строка VEN_1AB8&DEV_4005&SUBSYS_04001AB8&REV_00 определяет видеоадаптер «Parallels Display».
Помимо этого, в VirtualBox можно найти строку VEN_80EE&DEV_CAFE&SUBSYS_00000000&REV_00, определяющую некий «VirtualBox Device», а у Parallels Workstation строки VEN_1AB8&DEV_4000&SUBSYS_04001AB8&REV_00 и VEN_1AB8&DEV_4006&SUBSYS_04061AB8&REV_00, определяющие «Parallels Tools Device» и «Parallels Memory Controller» соответственно.
Алгоритм действий следующий: пытаемся открыть нужный нам ключ, и если он открывается успешно, то оборудование, описанное этим ключом, в наличии и можно делать вывод о присутствии какой-либо виртуальной машины:
Идентификатор процессора определяется с помощью команды cpuid. Благодаря ей можно получить много всякой полезной информации об установленном процессоре. Вид выдаваемой этой командой информации зависит от содержимого регистра EAX. Результат работы команды записывается в регистры EBX, ECX и EDX. Подробно про эту команду можно почитать в любой книге по программированию на ассемблере. Для наших целей мы будем использовать эту инструкцию, предварительно положив в регистр EAX значение 0x40000000:
После выполнения этого кода на VMware Workstation в переменных ID_1, ID_2 и ID_3 будут записаны значения 0x61774d56, 0x4d566572 и 0x65726177 соответственно (в символьном представлении это не что иное, как «VMwareVMware»), на VirtualBox в ID_1 и в ID_2 будет лежать значение 0x00000340, а на Parallels Workstation в ID_1 0x70726c20, в ID_2 — 0x68797065 и в ID_3 — 0x72762020 (что соответствует строке «prl hyperv»).
Использование MAC-адреса для идентификации производителя сетевой карты, конечно, не самый надежный способ (ибо MAC-адрес довольно-таки просто поменять), но тем не менее его вполне можно применить для детекта виртуальных машин в качестве дополнительной проверки.
Ты наверняка знаешь, что первые три байта MAC-адреса сетевой карты определяют ее производителя. Производители виртуальных машин в этом плане не исключение:
Вытащить эти первые три байта из MAC-адреса нам поможет API-функция GetAdaptersInfo:
Вспомогательные процессы, окна и другие «подозрительные» объекты
Для нормальной работы практически все виртуальные машины требуют установки дополнений к гостевой операционной системе, например VBoxGuestAddition для VirtualBox или Parallels Tools для Parallels Workstation. Без этих дополнений работа с виртуальной машиной несколько затруднительна (ни тебе нормального разрешения экрана и полноэкранного режима, ни взаимодействия с USB-девайсами, ни нормальной настройки сетевых подключений). В общем, все производители виртуалок не рекомендуют использовать их без этих дополнений. А эти самые дополнения оставляют очень заметный след в виде запущенных процессов:
Для поиска процесса по имени мы воспользуемся функциями CreateToolhelp32Snapshot, Process32First и Process32Next:
Помимо непосредственно самих процессов, демаскирующим признаком могут стать окна, открытые этими процессами. Окон в каждой из рассматриваемых виртуальных машин может быть довольно много, и все их мы перечислять не будем, а ограничимся одним или двумя. Итак:
Открытые окна для VMware (красным выделено окно класса VMSwitchUserControlClass)
Найти окно по имени класса очень просто — для этого есть функция FindWindow:
Помимо процессов и окон, указывающих на наличие ВМ, можно найти и другие «подозрительные» объекты — например, если покопаться в гостевой ОС виртуальной машины утилитой WinObj или какой-нибудь аналогичной, то можно найти вот такие объекты:
«Подозрительные» объекты в VirtualBox
Проверить наличие «подозрительного» объекта очень просто, достаточно попытаться открыть его с помощью CreateFile:
Что еще «подозрительного» можно найти в реестре?
Помимо признаков наличия специфического оборудования, в реестре можно увидеть и другие следы, оставляемые виртуальными машинами. Некоторые из них базируются в ветке HKLMHARDWAREACPIDSDT. Достаточно в этом месте проверить наличие таких вот ключей:
Проверку реализуем так же, как мы проверяли наличие определенного оборудования. Просто делаем попытку открыть нужный нам ключ и, в случае успеха, делаем вывод о наличии ВМ.
Ключ PRLS__ в реестре Parallels Workstation
Возможности, заложенные производителем
Некоторые производители (в частности, VMware и Microsoft) специально реализуют возможности управления своими продуктами, которые можно использовать для наших целей.
В Virtual PC используются инвалидные (не «инвалидные», а «альтернативно одаренные». И вообще-то они «недействительные». — Прим. ред.) команды процессора с опкодами 0x0F, 0x3F, 0x07 и 0x0B, попытка выполнения которых на реальном процессоре вызовет исключение, в то время как на Virtual PC все пройдет нормально. С помощью этих команд можно достаточно просто задетектить виртуалку от Microsoft:
В VMware Workstation для взаимодействия гостевой и основной ОС реализован небольшой бэкдор в виде порта с номером 0x5658. Для его использования необходимо в EAX положить «магическое» число 0x564d5868 (в символьном представлении — «VMXh»), а в ECX записать одну из команд взаимодействия гостевой и основной ОС (например, команда 0x0A возвращает версию установленной VMware Workstation). Короче, выглядит все это приблизительно так:
Заключение
Как видишь, признаков, характерных для виртуальных машин, предостаточно, и для того, чтобы их увидеть, сильно глубоко копать совсем не нужно.
Источник
Обзор 3-х популярных виртуальных машин для Windows
Чтобы иметь под рукой сразу несколько операционных систем с отдельным рабочим пространством и приложениями, не нужно покупать второй (третий, четвертый и т. д.) компьютер. Потому что всё это уместится в вашем единственном ПК. Как? Благодаря виртуальным машинам (ВМ) — особым программам, которые создают (эмулируют) внутри основной операционной системы воображаемые (виртуальные) компьютеры.
Виртуальный ПК почти как настоящий. У него есть собственный процессор, память, жесткий диск, сетевой адаптер и всё остальное. Конечно, это не физические устройства, но сделаны они так, чтобы операционные системы считали их именно такими — настоящими.
На одном физическом компьютере одновременно может работать несколько виртуальных. Сколько именно — зависит от аппаратных ресурсов: чем шустрее процессор, объемнее оперативка, просторнее накопитель, тем больше. Обычный домашний ПК средней производительности на базе Windows 10 справляется с одновременной работой трех-пяти легковесных ОС (например, Windows XP, Android и Lubuntu + основная система). Или двух-трех относительно тяжеловесных (например, основная Windows 10 + виртуальные Windows 7 и Mac OS X). Как вы уже поняли, приложения-эмуляторы виртуальных компьютеров позволяют устанавливать и запускать на них самые разные ОС.
Для чего используются виртуальные машины
Виртуальные машины общего назначения (в отличие от специализированных — таких, как, например, VM Java), используют:
Ну и конечно, виртуальные машины повсеместно используют для распределения рабочих ресурсов серверов.
Сегодня мы не будем касаться промышленного применения ВМ, а рассмотрим только то, что может быть полезно домашним пользователям ОС Windows.
Oracle Virtualbox
Виртуальная машина Oracle Virtualbox, пожалуй, наиболее известна и популярна у домашних пользователей ПК. Она русифицирована, бесплатна, поддерживает все основные операционные системы, включая Android, и довольно проста в применении. Сделать минимально необходимые настройки и установить в нее операционную систему сможет даже слабо подготовленный юзер, если имеет под рукой инструкцию по установке выбранной ОС.
Даже беглого взгляда на рабочую область Virtualbox достаточно, чтобы понять, что здесь к чему и как примерно пользоваться программой. Слева — список всех операционных систем, установленных на платформу Virtualbox (гостевых), справа — окно параметров виртуального компьютера выбранной из списка ОС или окно снимков — сохраненных состояний этой системы (некий аналог точек восстановления). На верхней панели — основные инструменты управления: кнопки мастера создания новой ВМ, перехода в меню настроек и запуска ВМ. Вверху справа — кнопки переключения вкладок левой части окна (на скриншоте показана вкладка настроек).
Освоить основные функции программы — установку и запуск операционной системы, настройку параметров виртуального компьютера, большинству пользователей удается без инструкций. А для самых пытливых умов, стремящихся постичь все секреты Virtualbox, на официальном сайте есть англоязычный учебник.
Рассмотрим процесс создания новой виртуальной машины и начало установки в нее Windows 10.
Некоторые настройки ВМ и гостевой системы
Клик в окне виртуальной машины захватывает курсор мыши (т. е. он будет двигаться только в пределах виртуального экрана). Для возврата курсора в основную ОС нажмите комбинацию Ctrl+Alt.
Для доступа ко всему набору функций гостевой ОС нужно установить специальные дополнения. Зайдите в меню «Устройства», щелкните «Подключить образ диска дополнений гостевой ОС» и следуйте дальнейшим инструкциям.
Чтобы подключить к гостевой системе папку для обмена файлами с основной, кликните в меню «Устройства» пункт «Общие папки». Нажмите на значок «папка+» в открывшемся окне и через поле «путь к папке» укажите ее в проводнике (в нем показаны каталоги основной системы).
Если хотите, чтобы настройка работала постоянно, отметьте «Авто-подключение» и «Создать постоянную папку». Общая папка будет доступна из проводника виртуальной машины как сетевая.
Чтобы сохранить текущее состояние гостевой ОС, откройте меню «Машина» и выберите «Сделать снимок состояния».
Чтобы изменить порядок опроса загрузочных устройств (например, для загрузки виртуальной машины с DVD), завершите работу гостевой ОС, откройте ее настройки (в главном окне Virtualbox) и зайдите на первую вкладку раздела «Система». В списке «Порядок загрузки» отметьте нужный носитель и, нажимая кнопки со стрелками, передвиньте его наверх.
VMware Workstation Pro
VMware Workstation pro — не менее функциональный продукт, чем Vrtualbox, но рассчитанный на профессиональное применение и интеграцию с другими сервисами производителя. Не бесплатный и довольно дорогостоящий, однако тоже очень популярный у домашних пользователей Windows.
Бесплатная версия VMware для личного использования тоже существует. Это VMware Workstation Player, но малая функциональность, сильно уступающая даже некоммерческому Vrtualbox, отвернула от него любовь наших сограждан.
Полноценный VMware Workstation Pro, с которым мы будем знакомиться сегодня, как и конкурент, поддерживает массу операционных систем, включая мобильные и Mac OS X (кстати, он совместим с большим количеством редакций OS X, нежели Virtualbox), и эмулирует все основные устройства компьютера. Еще он эмулирует интерфейс BIOS, в отличие от Vrtualbox.
Рассмотрим, как проходит процесс создания виртуальной машины и запуск установки Windows 10 на платформе VMware Workstation Pro.
Дизайн основного окна программы (который, кстати, видоизменяется от версии к версии) не позволит запутаться даже начинающему пользователю.
Список всех установленных гостевых операционных систем находится на вкладке «Мой компьютер».
Некоторые опции виртуальной машины VMware
До установки VMware Tools окно гостевой системы, как и в Virtualbox, захватывает курсор мыши. Для возврата его в основную ОС нажмите Ctrl+Alt.
Чтобы попасть в интерфейс BIOS виртуальной машины, выделите ее в списке, откройте меню запуска (кнопка «play» на верхней панели) и кликните «При включении (машины) войти в режим BIOS».
Microsoft Hyper-V
Диспетчер виртуальных машин Hyper-V — это встроенный компонент операционных систем всех редакций Windows 7-10, за исключением начальной и домашних. Если разобраться, он не хуже и не сложнее, чем два рассмотренных выше, просто некоторые пользователи ничего не знают о его существовании и только поэтому предпочитают сторонний софт.
Чтобы активировать диспетчер Hyper-V, зайдите в раздел приложений панели управления Windows, щелкните «Включение и выключение компонентов Виндовс» и в открывшемся окошке отметьте «Hyper-V».
Перезагрузите компьютер, откройте поиск и с его помощью запустите диспетчер Hyper-V.
Список всех виртуальных машин Hyper-V отображается в средней части окна диспетчера. Чтобы запустить любую из них, кликните 2 раза по ее имени. В окошке, которое откроется после этого, нажмите кнопку «Пуск».
Чтобы виртуальные машины Hyper-v могли подключаться к Интернету, запустите через панель «Действия» диспетчер виртуальных коммутаторов. Выберите в показанном ниже списке тип сети «Внешняя» и нажмите «Создать виртуальный коммутатор». Сети «Внутренняя» и «Частная» предназначены для соединения виртуальных компьютеров между собой, и большинству пользователей не нужны.
На следующей странице обычно ничего менять не требуется, кроме, если хотите, имени подключения. В выпадающем списке «Внешняя сеть» должен быть указан сетевой адаптер физического компьютера, который соединен с роутером или кабелем интернет-провайдера. Ниже должен стоять флажок «Разрешить управляющей ОС предоставлять общий доступ к адаптеру» (т. е. к Интернету).
Кстати, Hyper-v поддерживает не только операционные системы семейства Windows, но и некоторых конкурентов, в частности, Linux и FreeBSD. Полный список всех совместимых с ним платформ, а также условия их использования в среде Windows, приведены на сайте MSDN.microsoft.
Некоторые опции виртуальных машин Hyper-V
Чтобы сделать снимок состояния запущенной гостевой ОС, Откройте верхнее меню ее окна «Действие» и щелкните «Контрольная точка». Либо нажмите комбинацию Ctrl+N.
Доступ к настройкам отдельной виртуальной машины открывается из ее контекстного меню в списке главного окна диспетчера и скрывается за кнопкой «Параметры».
Прочие возможности программы тоже весьма незамысловаты и осваиваются без особого труда.
Источник
Виртуальные машины. Как сделать компьютер в компьютере
Содержание
Содержание
В одном обычном компьютере можно создать сразу несколько виртуальных, чтобы познакомиться с возможностями Linux или другими экзотическими ОС, запустить очень старую и сегодня неподдерживаемую программу, пройти заново игру детства на современном железе. Или же запустить Windows Vista внутри Windows 7 внутри Windows 8 внутри Windows 10. Просто потому, что захотелось.
Что такое виртуальные машины
Виртуальная машина — это эмулятор компьютера в самом широком смысле. Это почти как эмулятор игровой приставки или Android-устройства, только настраивается гораздо гибче.
Например, на эмуляторе Sony PlayStation не получится запустить игру под Nintendo GameBoy. А эмулятор DOSbox — это очень условный, специализированный виртуальный компьютер с эмуляцией определенного списка старого оборудования и со встроенной системой DOS, так что запустить там Windows 10 не получится.
Виртуальная машина же — это эмулятор персонального компьютера с практически любым железом. И на этот компьютер можно устанавливать любую операционную систему и программы, которые нужны.
Зачем нужны виртуальные машины
В деловых процессах виртуальные машины используются активно — там это нужно. Центры обработки данных, облачные вычисления, виртуальные серверы, разграничение доступа и все такое. На одном и том же железе может работать отдельный файловый архив, отдельный веб-сервер, отдельный сервер авторизации — и все на разных системах, полностью изолированных друг от друга. Но зачем нужна технология виртуальных машин обычному домашнему пользователю?
Вот простой пример: у вас есть компьютер и на нем, скорее всего, установлена операционная система Windows. Для изучения программирования вам требуется linux, но вы не хотите экспериментировать со своим компьютером, разбивать личный диск на несколько разделов и рисковать потерей данных. Виртуальная машина позволит работать в другой системе, при этом родная Windows никак не пострадает.
Или, например, есть очень важная и нужная программа, которая запускается только под WindowsXP конкретной версии и сборки. Причем эта программа откажется запускаться, если оперативной памяти больше 128 мегабайт. Можно отпилить часть микросхем от современного модуля на 16 гигабайт, но что-то вам подсказывает, что так делать не нужно. А вот виртуальная машина поможет запустить капризный софт, эмулируя компьютер с нужным объемом памяти.
А вот, допустим, игра двадцатилетней давности, которую вы нашли на антресолях и пытаетесь установить в приступе ностальгии. Игра отказывается верить в существование восьмиядерного процессора и вылетает с ошибкой «так не бывает». Виртуальная машина с нужными характеристиками поможет вспомнить былые времена и запустить игру.
Часто виртуальная машина используется в качестве «песочницы» — маленькой игровой площадки для программы, которая вызывает у вас подозрения. Чтобы не рисковать, вы запускаете сомнительную программу внутри виртуальной машины, а не на настоящем компьютере: софт честно делает свою работу, потом шифрует все файлы и требует денег, например. Но в виртуальной системе, в той самой «песочнице» не было никаких ценных данных, поэтому вы можете спокойно удалить виртуальную машину с наглой программой внутри. Здорово же!
Наконец, приверженцы техники Apple или убежденные Linux-пользователи тоже могут использовать виртуальную машину, чтобы запустить какой-то специфический софт, который работает только под Windows.
Как видите, даже для домашнего пользования виртуальные машины могут пригодиться. Поэтому разберемся с основными характеристиками и научимся создавать компьютер в компьютере.
Основные термины и их понимание
Гость (guest, гест, гостевая система, таргет) — это виртуальный компьютер, один или несколько, который запускается на хосте.
Хост — это основной компьютер, на котором запускаются виртуальные машины. Производительность хоста должна быть достаточной, чтобы тянуть и собственную систему, и гостевую. Для запуска одной виртуальной машины вполне достаточно возможностей любого современного компьютера. Но для нормальной работы нескольких систем одновременно лучше иметь не меньше шестнадцати гигабайт оперативной памяти, а образы компьютеров создавать на скоростном SSD-накопителе. По очевидным причинам, у вас не получится создать виртуальную машину с характеристиками выше, чем у самого хоста — если на основном компьютере всего 8 гигабайт оперативной памяти, то создать таргет с 16 ГБ не выйдет.
Гипервизор — специализированная программа для создания виртуальных машин и управления ими. Для домашнего пользования есть бесплатные программы-гипервизоры с минимальным количеством настроек и функций. В бизнес-сфере используются более продвинутые решения, а некоторые гипервизоры и вовсе устанавливаются вместо операционной системы, чтобы сразу несколько мощных компьютеров можно было объединить в большой виртуальный хост. Это называется «консолидация серверов». Дорогое удовольствие, как по затратам на железо, так и на гипервизор.
Образ — термин достаточно известный, обозначает файл с полной цифровой копией какого-либо носителя внутри. Обычно применяется в отношении оптических дисков, но в нашем случае в образе может храниться и дискета, и виртуальный жесткий диск.
Установка
Чтобы начать знакомство с виртуальной машиной потребуется установить гипервизор. Таковых существует множество: платных и не очень, для тонкой настройки всего и вся или базового «нажал — заработало». Virtualbox — один из наиболее популярных гипервизоров, потому что бесплатный, доступен под Windows, Mac OS и Linux, активно развивается и поддерживается сообществом разработчиков и энтузиастов. Скачать VirtualBox можно с официального сайта, но учтите, он на английском.
Начиная с шестой версии в VirtualBox убрали поддержку 32-битных хост-систем, но пятая версия до сих пор доступна для скачивания. В любом случае, можно скачать обе версии. Для более комфортной работы потребуется еще и набор расширений — ExtensionPack.
Устанавливается VirtualBox довольно просто, достаточно последовательно соглашаться со всеми предложениями. Перед установкой появится большое предупреждение о том, что компьютер будет отключен от сети, на время установки виртуальных сетевых карт — это нормально. А в ходе установки появится несколько подтверждающих окон — это устанавливается эмулятор USB, сетевых карт и других устройств.
Ну а после установки появится основное окно гипервизора на родном русском языке.
Первым же делом желательно установить пакет расширений — он добавляет поддержку USB 2.0, подключение по протоколу RDP, поддержку накопителей с NVMe и прочие полезные вещи. В стандартной установке все эти возможности отсутствуют из-за различных лицензий: сам гипервизор бесплатный во все стороны, а расширения бесплатны только для личного пользования и ознакомления.
Чтобы установить расширения достаточно запустить файл Extensionpack дабл-кликом, но делать это нужно после установки самого Virtualbox — потому что установщик расширений запускается внутри гипервизора.
Как работает виртуальная машина
Гипервизор создает файл образа жесткого диска, резервирует определенное количество оперативной памяти и занимает процессорное время — это необходимо для работы «контейнера», в котором будет работать виртуальная машина. Изнутри же «контейнер» выглядит как полноценный компьютер с жестким диском, оптическим приводом, дисководом, сетевой картой, видеоадаптером, звуковой картой и прочим оборудованием. Причем заменить видеокарту обычно нельзя — она эмулируется как встроенная в материнскую плату. А вот в оптический привод можно либо загрузить образ из файла, либо использовать существующий привод хоста.
Процессор виртуализируется как минимум одним ядром. Для старых систем лучше не использовать многоядерность — не поймут, испугаются и будут глючить. А новым больше двух ядер нужно выдавать только при реальной необходимости.
Подключенные к хосту USB-устройства можно пробросить внутрь виртуальной машины. Достаточно выбрать для конкретной машины нужный пункт из меню «Устройства — USB». При этом, например, флэшка исчезнет из списка накопителей в хост-системе и станет видна в виртуальной машине. Также можно поступить с любым другим USB-устройством, но не забудьте сначала установить Extensionpack, иначе скорость USB 1.1 вас огорчит.
Чтобы файлы на основной системе были доступны в виртуальной ОС можно воспользоваться общими папками: они монтируются как сетевые пути, но удобнее автоматически их монтировать как сетевой диск — он будет подключаться при загрузке системы. Подробности разберем на этапе настройки.
Создаем виртуальный компьютер
Создать новую виртуальную машину в VirtualBox поможет встроенный мастер настройки. Достаточно ввести название виртуального компьютера, а гипервизор на его основе попытается определить нужную операционную систему и выдаст рекомендуемые параметры. Если название слишком оригинальное, то потребуется указать тип гостевой операционной системы вручную.
Несмотря на то, что в списке поддерживаемых систем есть даже Windows 3.1, лучше всего виртуализируются относительно свежие системы, начиная хотя бы с Windows 2000. С win9x немного сложнее: сначала нужно загрузить DOS из образа дискеты, а уже потом запускать установщик — в те времена загрузочные CD не делали, потому что оптические носители только-только появлялись.
Следующим шагом будет выбор объема оперативной памяти и виртуального жесткого диска — если нет специальных требований, то автоматически предложенные значения можно не менять.
После создания виртуальной машины необходимо открыть ее настройки и подключить образ загрузочного компакт-диска на вкладке «носители». И теперь можно запускать виртуальный компьютер.
Установка системы у многих пользователей не вызовет лишних вопросов, поэтому подробно описывать этот процесс не будем. А последующая установка драйверов — другое дело. В VirtualBox есть специальный «диск с драйверами», который называется «Дополнения гостевой ОС» — его можно подключить через пункт меню.
Дополнения — это диск с драйверами, который загружается в виртуальный привод оптических дисков. В Windows-системах достаточно запустить файл autorun с диска, а под Linux — соответствующий скрипт. Главная выгода от установки гостевых драйверов — возможность произвольно менять размеры окна виртуальной машины, а разрешение экрана автоматически подстроится. А, ну и цвета станут повеселее: не 16 базовых, а 32 миллиона оттенков.
Настраиваем взаимодействие с хостом и сеть
Виртуальная машина с настройками «по умолчанию» получает доступ в интернет, но не имеет никакой связи с основным компьютером. А иногда эта связь нужна…
В настройках можно включить двусторонний буфер обмена. Он, правда, работает только с текстовой информацией, но упрощает ввод интернет-адресов и консольных команд. Для приема-передачи файлов можно настроить сетевые папки. Любая папка на хосте может быть подключена в виде сетевой папки в гостевой системе. Дополнительно можно выдать права гостевой системе на запись в эту папку и автоматически подключать папку в качестве диска при загрузке системы. Так, например, папка Downloads на хост-системе может быть доступна из гостевой системы через сетевое окружение по адресу //vboxsvr/Downloads или автоматически подключаться как сетевой диск.
Для экспериментов с Linux-системами и виртуальными серверами часто требуется доступ из хоста к веб-серверу, который запускается на гостевой ОС. Для этого нужно переключить режим сетевой карты с «NAT» на «виртуальный адаптер хоста» или же «Virtualbox Host-only Ethernet Adapter». В последнем случае у гостевой системы не будет личного доступа в интернет, но она сможет общаться с основным компьютером. Так, например, с хоста можно постучаться на файловый сервер, который работает на виртуальной машине.
В данном случае это специализированный linux-дистрибутив openmediavault для создания сетевого хранилища, который запущен в виртуальной машине с типом сетевого адаптера «только хост».
Проблемы с виртуализацией
Главная проблема — отсутствие вменяемой поддержки видеоадаптера и 3D-ускорения. На обычной хост-системе вы можете пользоваться новейшей видеокартой, но все ее преимущества в виртуальной машине будут недоступны. Впрочем, старые игры не особо требовательны к видео — в большинстве случаев справится и встроенный видеоадаптер процессора.
Второй момент — поддержка современного интернета старыми системами. Открыть любой сайт в системе, которая устарела лет на 10–20, может быть проблематично. Либо страница загрузится не полностью, либо не загрузится вовсе.
Виртуализируй это!
Виртуальные машины позволят вам изучить экзотические ОС на современном компьютере. Помимо множества современных Linux-дистрибутивов, это может быть:
Также можно установить старую версию Windows и попробовать покорить современный интернет. Во времена технологии Active Desktop в windows98 интернет был очень другим.
Источник
Время на прочтение
8 мин
Количество просмотров 260K
Язык программирования Python считается достаточно простым. На нем легче и быстрее пишутся программы, по сравнению с компилируемыми языками программирования. Для Python существует множество библиотек, позволяющих решать практически любые задачи. Есть, конечно, и минусы и другие нюансы, но это отдельная тема.
Довольно часто я вижу, как мои знакомые и друзья начинают изучать Python и сталкиваются с проблемой установки и использования сторонних библиотек. Они могут несколько часов потратить на установку библиотеки, и даже, могут не справиться с этим и забить на неё. В то время как, в большинстве случаев, это можно было сделать за несколько минут.
Статья начинается с базовых вещей: с установки Python 3, инструментов разработки Pip и Virtualenv и среды разработки PyCharm в Windows и в Ubuntu. Для многих это не представляет трудностей и возможно, что уже всё установлено.
После чего будет то, ради чего задумывалась статья, я покажу как в PyCharm создавать и использовать виртуальные окружения и устанавливать в них библиотеки с помощью Pip.
Установка Python и Pip
Pip является менеджером пакетов для Python. Именно с помощью него обычно устанавливаются модули/библиотеки для разработки в виде пакетов. В Windows Pip можно установить через стандартный установщик Python. В Ubuntu Pip ставится отдельно.
Установка Python и Pip в Windows
Для windows заходим на официальную страницу загрузки, где затем переходим на страницу загрузки определенной версии Python. У меня используется Python 3.6.8, из-за того, что LLVM 9 требует установленного Python 3.6.
Далее в таблице с файлами выбираем “Windows x86-64 executable installer” для 64-битной системы или “Windows x86 executable installer” для 32-битной. И запускаем скачанный установщик, например, для версии Python 3.8.1 он называется python-3.8.1-amd64.exe
.
Во время установки ставим галочку возле Add Python 3.x to PATH и нажимаем Install Now:
Установка Python и Pip в Ubuntu
В Ubuntu установить Python 3 можно через терминал. Запускаем его и вводим команду установки. Вторая команда выводит версию Python.
sudo apt install python3-minimal
python3 -V
Далее устанавливаем Pip и обновляем его. После обновления необходимо перезапустить текущую сессию (или перезагрузить компьютер), иначе возникнет ошибка во время вызова Pip.
sudo apt install python3-pip
pip3 install --user --upgrade pip
Основные команды Pip
Рассмотрим основные команды при работе с Pip в командой строке Windows и в терминале Ubuntu.
Если виртуальные окружения не используются, то во время установки пакета(ов) полезно использовать дополнительно ключ --user
, устанавливая пакет(ы) локально только для текущего пользователя.
Установка VirtualEnv и VirtualEnvWrapper
VirtualEnv используется для создания виртуальных окружений для Python программ. Это необходимо для избежания конфликтов, позволяя установить одну версию библиотеки для одной программы, и другу для второй. Всё удобство использования VirtualEnv постигается на практике.
Установка VirtualEnv и VirtualEnvWrapper в Windows
В командной строке выполняем команды:
pip install virtualenv
pip install virtualenvwrapper-win
Установка VirtualEnv и VirtualEnvWrapper в Ubuntu
Для Ubuntu команда установки будет следующей:
pip3 install --user virtualenv virtualenvwrapper
После которой в конец ~/.bashrc
добавляем:
export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3
source ~/.local/bin/virtualenvwrapper.sh
При новом запуске терминала должны будут появиться сообщения, начинающиеся на virtualenvwrapper.user_scripts creating
, что говорит об успешном завершении установки.
Работа с виртуальным окружением VirtualEnv
Рассмотрим основные команды при работе с VirtualEnv в командой строке Windows и в терминале Ubuntu.
Находясь в одном из окружений, можно ставить пакеты через Pip, как обычно и нет необходимости добавлять ключ --user
:
pip3 install markdown
Для Windows можно указать в переменных среды WORKON_HOME
для переопределения пути, где хранятся виртуальные окружения. По умолчанию, используется путь %USERPROFILE%Envs
.
Установка PyCharm
PyCharm — интегрированная среда разработки для языка программирования Python. Обладает всеми базовыми вещами необходимых для разработки. В нашем случае огромное значение имеет хорошее взаимодействие PyCharm с VirtualEnv и Pip, чем мы и будем пользоваться.
Установка PyCharm в Windows
Скачиваем установщик PyCharm Community для Windows с официального сайта JetBrains. Если умеете проверять контрольные суммы у скаченных файлов, то не забываем это сделать.
В самой установке ничего особенного нету. По сути только нажимаем на кнопки next, и в завершение на кнопку Install. Единственно, можно убрать версию из имени папки установки, т.к. PyCharm постоянно обновляется и указанная версия в будущем станет не правильной.
Установка PyCharm в Ubuntu
Скачиваем установщик PyCharm Community для Linux с официального сайта JetBrains. Очень хорошей практикой является проверка контрольных сумм, так что если умеете, не ленитесь с проверкой.
Распаковываем архив с PyCharm и переименовываем папку с программой в pycharm-community
, убрав версию из названия.
Теперь в директории ~/.local
(Ctrl + H — Показ скрытый файлов), создаем папку opt
, куда и перемещаем pycharm-community
. В результате по пути /.local/opt/pycharm-community
должны размещаться папки bin
, help
и т.д. Таким образом PyCharm будет находится в своём скромном месте и никому не будет мешать.
Далее выполняем команды в терминале:
cd /home/maksim/.local/opt/pycharm-community/bin
sh ./pycharm.sh
Производим установку. И очень важно в конце не забыть создать desktop файл для запуска PyCharm. Для этого в Окне приветствия в нижнем правом углу нажимаем на Configure → Create Desktop Entry.
Установка PyCharm в Ubuntu из snap-пакета
PyCharm теперь можно устанавливать из snap-пакета. Если вы используете Ubuntu 16.04 или более позднюю версию, можете установить PyCharm из командной строки.
sudo snap install pycharm-community --classic
Использование VirtualEnv и Pip в PyCharm
Поддержка Pip и Virtualenv в PyCharm появилась уже довольно давно. Иногда конечно возникают проблемы, но взаимодействие работает в основном стабильно.
Рассмотрим два варианта работы с виртуальными окружениями:
- Создаём проект со своим собственным виртуальным окружением, куда затем будут устанавливаться необходимые библиотеки;
- Предварительно создаём виртуальное окружение, куда установим нужные библиотеки. И затем при создании проекта в PyCharm можно будет его выбирать, т.е. использовать для нескольких проектов.
Первый пример: использование собственного виртуального окружения для проекта
Создадим программу, генерирующую изображение с тремя графиками нормального распределения Гаусса Для этого будут использоваться библиотеки matplotlib и numpy, которые будут установлены в специальное созданное виртуальное окружение для программы.
Запускаем PyCharm и окне приветствия выбираем Create New Project.
В мастере создания проекта, указываем в поле Location путь расположения создаваемого проекта. Имя конечной директории также является именем проекта. В примере директория называется ‘first_program’.
Далее разворачиваем параметры окружения, щелкая по Project Interpreter. И выбираем New environment using Virtualenv. Путь расположения окружения генерируется автоматически. В Windows можно поменять в пути папку venv
на Envs
, чтобы команда workon
находила создаваемые в PyCharm окружения. Ставить дополнительно галочки — нет необходимости. И нажимаем на Create.
Теперь установим библиотеки, которые будем использовать в программе. С помощью главного меню переходим в настройки File → Settings. Где переходим в Project: project_name → Project Interpreter.
Здесь мы видим таблицу со списком установленных пакетов. В начале установлено только два пакета: pip и setuptools.
Справа от таблицы имеется панель управления с четырьмя кнопками:
- Кнопка с плюсом добавляет пакет в окружение;
- Кнопка с минусом удаляет пакет из окружения;
- Кнопка с треугольником обновляет пакет;
- Кнопка с глазом включает отображение ранних релизов для пакетов.
Для добавления (установки) библиотеки в окружение нажимаем на плюс. В поле поиска вводим название библиотеки. В данном примере будем устанавливать matplotlib. Дополнительно, через Specify version можно указать версию устанавливаемого пакета и через Options указать параметры. Сейчас для matplotlib нет необходимости в дополнительных параметрах. Для установки нажимаем Install Package.
После установки закрываем окно добавления пакетов в проект и видим, что в окружение проекта добавился пакет matplotlib с его зависимостями. В том, числе был установлен пакет с библиотекой numpy. Выходим из настроек.
Теперь мы можем создать файл с кодом в проекте, например, first.py. Код программы имеет следующий вид:
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-5, 5, 100)
def gauss(sigma, mu):
return 1/(sigma * (2*np.pi)**.5) * np.e ** (-(x-mu)**2/(2 * sigma**2))
dpi = 80
fig = plt.figure(dpi=dpi, figsize=(512 / dpi, 384 / dpi))
plt.plot(x, gauss(0.5, 1.0), 'ro-')
plt.plot(x, gauss(1.0, 0.5), 'go-')
plt.plot(x, gauss(1.5, 0.0), 'bo-')
plt.legend(['sigma = 0.5, mu = 1.0',
'sigma = 1.0, mu = 0.5',
'sigma = 1.5, mu = 0.0'], loc='upper left')
fig.savefig('gauss.png')
Для запуска программы, необходимо создать профиль с конфигурацией. Для этого в верхнем правом углу нажимаем на кнопку Add Configuration…. Откроется окно Run/Debug Configurations, где нажимаем на кнопку с плюсом (Add New Configuration) в правом верхнем углу и выбираем Python.
Далее указываем в поле Name имя конфигурации и в поле Script path расположение Python файла с кодом программы. Остальные параметры не трогаем. В завершение нажимаем на Apply, затем на OK.
Теперь можно выполнить программу и в директории с программой появится файл gauss.png
:
Второй пример: использование предварительно созданного виртуального окружения
Данный пример можно использовать во время изучения работы с библиотекой. Например, изучаем PySide2 и нам придется создать множество проектов. Создание для каждого проекта отдельного окружения довольно накладно. Это нужно каждый раз скачивать пакеты, также свободное место на локальных дисках ограничено.
Более практично заранее подготовить окружение с установленными нужными библиотеками. И во время создания проектов использовать это окружение.
В этом примере мы создадим виртуальное окружения PySide2, куда установим данную библиотеку. Затем создадим программу, использующую библиотеку PySide2 из предварительно созданного виртуального окружения. Программа будет показывать метку, отображающую версию установленной библиотеки PySide2.
Начнем с экран приветствия PyCharm. Для этого нужно выйти из текущего проекта. На экране приветствия в нижнем правом углу через Configure → Settings переходим в настройки. Затем переходим в раздел Project Interpreter. В верхнем правом углу есть кнопка с шестерёнкой, нажимаем на неё и выбираем Add…, создавая новое окружение. И указываем расположение для нового окружения. Имя конечной директории будет также именем самого окружения, в данном примере — pyside2
. В Windows можно поменять в пути папку venv
на Envs
, чтобы команда workon
находила создаваемые в PyCharm окружения. Нажимаем на ОК.
Далее в созданном окружении устанавливаем пакет с библиотекой PySide2, также как мы устанавливали matplotlib. И выходим из настроек.
Теперь мы можем создавать новый проект использующий библиотеку PySide2. В окне приветствия выбираем Create New Project.
В мастере создания проекта, указываем имя расположения проекта в поле Location. Разворачиваем параметры окружения, щелкая по Project Interpreter, где выбираем Existing interpreter и указываем нужное нам окружение pyside2
.
Для проверки работы библиотеки создаем файл second.py
со следующий кодом:
import sys
from PySide2.QtWidgets import QApplication, QLabel
from PySide2 import QtCore
if __name__ == "__main__":
app = QApplication(sys.argv)
label = QLabel(QtCore.qVersion())
label.show()
QtCore.qVersion()
sys.exit(app.exec_())
Далее создаем конфигурацию запуска программы, также как создавали для первого примера. После чего можно выполнить программу.
Заключение
У меня нет богатого опыта программирования на Python. И я не знаком с другими IDE для Python. Поэтому, возможно, данные IDE также умеют работать с Pip и Virtualenv. Использовать Pip и Virtualenv можно в командой строке или в терминале. Установка библиотеки через Pip может завершиться ошибкой. Есть способы установки библиотек без Pip. Также создавать виртуальные окружения можно не только с помощью Virtualenv.
В общем, я лишь поделился небольшой частью опыта из данной области. Но, если не вдаваться в глубокие дебри, то этого вполне достаточно знать, чтобы писать простые программы на Python с использованием сторонних библиотек.
Python знаменит своей обширной стандартной библиотекой и девизом
“батарейки в комплекте”
(batteries included).
Даже из коробки Python позволяет удобно и быстро решить огромный пласт задач,
например, например, работа с файлами, запуск простого веб-сервера,
работа с электронной почтой, парсинг XML и JSON, и так далее. Во всяком случае,
это намного удобнее, чем писать shell-скрипты 😅
Кроме того, у Python имеется огромная экосистема сторонних библиотек,
поддерживаемых сообществом энтузиастов. Эти библиотеки реализуют отсутствующую
в стандартной поставке функциональность, либо пере-реализуют уже имеющуюся, но
удобнее. Если у вас возникла потребность в какой-то функциональности, то
почти наверняка кто-то уже написал для этого библиотеку, и нужно просто погуглить.
Установка сторонней библиотеки
Каждый начинающий программист знает, как установить библиотеку. Набираем
и понеслась! Множество библиотек в своих инструкциях по установке именно так
и предлагают их устанавливать. Это и правда работает, это и правда так просто,
но есть нюансы. В этом месте закопаны очень популярные грабли, по которым
прошлось множество начинающих питонистов, в том числе и я.
Как pip
устанавливает пакеты
Давайте разберемся, что же происходит, когда юзер набирает в терминал такую
команду. В общих чертах происходит следующее.
pip
обращается в PyPI (Python Package Index) и
находит там запрашиваемый пакет.- Пакет скачивается. Обычно это просто zip-архив, который содержит
код библиотеки, разложенный внутри согласно формату. Современным и
рекомендуемым форматом пакетов является wheel (PEP-427),
но в дикой природе встречаются и другие форматы. pip
устанавливает пакет.- Библиотека установлена, ее можно импортировать и использовать.
Давайте подробнее разберем третий шаг. Установка пакета — звучит загадочно и
сложно, но на самом деле ничего сложного здесь не происходит. pip
просто
распаковывает zip-архив в определенное место (это справедливо для формата wheel,
для установки пакетов в других форматах могут потребоваться дополнительные
действия, но давайте разберем самый распространённый и простой случай). Куда
именно происходит установка? Это можно узнать, выполнив следующую команду:
$ python -m site
sys.path = [
'/Users/and-semakin',
'/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python38.zip',
'/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python3.8',
'/Users/and-semakin/.asdf/installs/python/3.8.2/lib/python3.8/lib-dynload',
'/Users/and-semakin/env/lib/python3.8/site-packages',
]
USER_BASE: '/Users/and-semakin/.local' (exists)
USER_SITE: '/Users/and-semakin/.local/lib/python3.8/site-packages' (doesn't exist)
ENABLE_USER_SITE: False
В списке sys.path
можно увидеть директорию site-packages
— именно туда
и будет установлена библиотека. Давайте в этом убедимся.
До установки пакета:
$ ls -l /Users/and-semakin/env/lib/python3.8/site-packages
total 8
drwxr-xr-x 3 and-semakin awesome 96 Apr 18 17:39 __pycache__
-rw-r--r-- 1 and-semakin awesome 126 Apr 18 17:39 easy_install.py
drwxr-xr-x 7 and-semakin awesome 224 Apr 18 17:39 pip
drwxr-xr-x 9 and-semakin awesome 288 Apr 18 17:39 pip-19.2.3.dist-info
drwxr-xr-x 7 and-semakin awesome 224 Apr 18 17:39 pkg_resources
drwxr-xr-x 42 and-semakin awesome 1344 Apr 18 17:39 setuptools
drwxr-xr-x 11 and-semakin awesome 352 Apr 18 17:39 setuptools-41.2.0.dist-info
Установим пакет:
После установки пакета:
$ ls -l /Users/and-semakin/env/lib/python3.8/site-packages
total 8
drwxr-xr-x 3 and-semakin awesome 96 Apr 18 17:39 __pycache__
drwxr-xr-x 7 and-semakin awesome 224 Apr 18 17:41 certifi
drwxr-xr-x 8 and-semakin awesome 256 Apr 18 17:41 certifi-2020.4.5.1.dist-info
drwxr-xr-x 43 and-semakin awesome 1376 Apr 18 17:41 chardet
drwxr-xr-x 10 and-semakin awesome 320 Apr 18 17:41 chardet-3.0.4.dist-info
-rw-r--r-- 1 and-semakin awesome 126 Apr 18 17:39 easy_install.py
drwxr-xr-x 11 and-semakin awesome 352 Apr 18 17:41 idna
drwxr-xr-x 8 and-semakin awesome 256 Apr 18 17:41 idna-2.9.dist-info
drwxr-xr-x 7 and-semakin awesome 224 Apr 18 17:39 pip
drwxr-xr-x 9 and-semakin awesome 288 Apr 18 17:39 pip-19.2.3.dist-info
drwxr-xr-x 7 and-semakin awesome 224 Apr 18 17:39 pkg_resources
drwxr-xr-x 21 and-semakin awesome 672 Apr 18 17:41 requests
drwxr-xr-x 8 and-semakin awesome 256 Apr 18 17:41 requests-2.23.0.dist-info
drwxr-xr-x 42 and-semakin awesome 1344 Apr 18 17:39 setuptools
drwxr-xr-x 11 and-semakin awesome 352 Apr 18 17:39 setuptools-41.2.0.dist-info
drwxr-xr-x 16 and-semakin awesome 512 Apr 18 17:41 urllib3
drwxr-xr-x 8 and-semakin awesome 256 Apr 18 17:41 urllib3-1.25.9.dist-info
Как видим, в директорию site-packages
добавилась библиотека requests
вместе
со всеми своими зависимостями.
Важные мысли, которые я пытаюсь донести:
- установка библиотеки напрямую влияет на файловую систему;
- у интерпретатора Python есть только одна директория
site-packages
, куда
pip
и устанавливает пакеты.
А это значит, что в один интерпретатор Python нельзя установить две версии
одной библиотеки одновременно. При установке новой версии предыдущая “перезатирается”.
Просто как если бы вы распаковали другой архив с совпадающими именами файлов
в то же самое место.
Боль — это жизненный опыт
Что же будет, если вам понадобится работать над двумя проектами, которые
будут требовать разных, не совместимых между собой версий одной и той же
библиотеки? Возможно, между этими версиями в библиотеку были внесены
какие-то крупные ломающие изменения, например, переименовались методы/функции
или изменился набор аргументов.
Например, проект А:
# requirements.txt
requests==2.23.0
Проект Б:
# requirements.txt
requests==1.2.3
Вы просто не сможете работать над такими проектами одновременно. Установка
зависимостей одного проекта сломает другой, и наоборот. При переключении между
проектами придётся каждый раз устанавливать зависимости нужного проекта, что
довольно легко забыть сделать.
Ситуация кажется маловероятной, но я гарантирую, что рано или поздно это
случится, если устанавливать зависимости всех своих проектов в один интерпретатор.
Всё усугубляется тем фактом, что прямые зависимости вашего проекта тянут за
собой свои зависимости (под-зависимости),
те, в свою очередь, тоже могут от чего-то зависеть (под-под-зависимости). В
итоге вы получаете целое дерево зависимостей. И если где-то в этом дереве
окажется библиотека не той версии, что ожидалось, то весь проект может начать
очень странно работать. Вы получите такие эзотерические ошибки, которых
еще никто в интернете до вас не встречал. Если всё сразу сломалось, то считайте,
что легко отделались — по крайней мере, так довольно просто понять, в чём проблема.
Но бывают и ситуации намного хуже, когда приложение просто начинает немножко
иначе работать, без каких-либо ошибок, и возможно придется потратить долгие
часы на траблшутинг, чтобы найти настоящую причину.
Надеюсь, я убедил вас, что устанавливать зависимости нескольких проектов в
один интерпретатор — это очень-очень плохо. Но как же тогда правильно?
Виртуальные окружения
Решение очевидно — у каждого проекта должен быть свой интерпретатор Python,
со своей собственной изолированной директорией site-packages
. Это и есть
основная идея, стоящая за виртуальными окружениями. Виртуальное окружение —
это самостоятельная копия интерпретатора со своими пакетами.
Как создавать виртуальные окружения
Начиная с Python версии 3.5 (на данный момент это самая старая из официально
поддерживаемых версий языка, так что справедливо ожидать, что как минимум
везде установлен Python 3.5 или новее), создать виртуальное окружение стало
очень просто:
$ python -m venv <путь к виртуальному окружению>
Например, допустим, что мы работаем над проектом blog_source
:
# заходим в директорию с проектом
$ cd src/blog_source
# создаем виртуальное окружение прямо рядом с кодом в директории env
$ python -m venv env
Создавать виртуальное окружения рядом с кодом — это распространённая практика,
так проще ничего не перепутать, но вообще виртуальное окружение может быть
где угодно, и директория тоже может называться как угодно. Обратите внимание,
что если вы создаете виртуальное окружение в директории под управлением
системы контроля версий (git), то его не нужно коммитить.
Лучше вообще добавьте его (env/
) в .gitignore
.
В директорию env
будет скопирован тот самый интерпретатор, при помощи
которого виртуальное окружение и создавалось. Т.е. если
то в виртуальном окружении будет та же самая версия:
$ env/bin/python -V
Python 3.8.2
Активируем окружение
Посмотрим, что внутри директории env
:
$ ls -l env/
total 8
drwxr-xr-x 13 and-semakin awesome 416 Apr 18 18:55 bin
drwxr-xr-x 2 and-semakin awesome 64 Apr 18 18:55 include
drwxr-xr-x 3 and-semakin awesome 96 Apr 18 18:55 lib
-rw-r--r-- 1 and-semakin awesome 113 Apr 18 18:55 pyvenv.cfg
$ ls -l env/bin/
total 88
-rw-r--r-- 1 and-semakin awesome 8471 Apr 18 18:55 Activate.ps1
-rw-r--r-- 1 and-semakin awesome 2218 Apr 18 18:55 activate
-rw-r--r-- 1 and-semakin awesome 1270 Apr 18 18:55 activate.csh
-rw-r--r-- 1 and-semakin awesome 2422 Apr 18 18:55 activate.fish
-rwxr-xr-x 1 and-semakin awesome 268 Apr 18 18:55 easy_install
-rwxr-xr-x 1 and-semakin awesome 268 Apr 18 18:55 easy_install-3.8
-rwxr-xr-x 1 and-semakin awesome 250 Apr 18 18:55 pip
-rwxr-xr-x 1 and-semakin awesome 250 Apr 18 18:55 pip3
-rwxr-xr-x 1 and-semakin awesome 250 Apr 18 18:55 pip3.8
lrwxr-xr-x 1 and-semakin awesome 59 Apr 18 18:55 python -> /Users/and-semakin/.asdf/installs/python/3.8.2/bin/python
lrwxr-xr-x 1 and-semakin awesome 6 Apr 18 18:55 python3 -> python
Обратите внимание, что в директории bin
есть некий файл activate
в
нескольких вариантах для разных шеллов. Это и есть “точка входа” в виртуальное
окружение. Просто создать виртуальное окружение мало, нужно его активировать.
Но сначала проверим, какие python
и pip
(исполняемые файлы) используются
в обычном режиме работы:
$ which python
/Users/and-semakin/.asdf/shims/python
$ which pip
/Users/and-semakin/.asdf/shims/pip
Это мой обычный Python, вне виртуального окружения, назовём его глобальным.
Теперь активируем виртуальное окружение:
$ source env/bin/activate
(env) $
Для Windows процесс активации будет отличаться (допустим, что виртуальное окружение
создано в C:srcblog_source
):
# cmd
C:srcblog_source> envScriptsactivate.bat
# либо в PowerShell
PS C:srcblog_source> envScriptsActivate.ps1
Обратите внимание, что приветствие шелла изменилось (добавилось (env)
), чтобы
показать, что мы “внутри” виртуального окружения под названием env
.
Теперь проверим еще раз, какие python
и pip
используются:
(env) $ which python
/Users/and-semakin/src/blog_source/env/bin/python
(env) $ which pip
/Users/and-semakin/src/blog_source/env/bin/pip
Посмотрите на пути — мы внутри виртуального окружения! Теперь можно смело
устанавливать любые пакеты, и это никак не повлияет на глобальный Python или
на другие виртуальные окружения:
(env) $ pip install requests flask whatever-you-need
Можно запускать любые файлы, и они будут иметь доступ к установленным пакетам:
(env) $ python make_money.py
Done! You are rich!
IDE тоже нужно настроить, указав путь к bin/python
внутри виртуального
окружения, тогда редактор сможет лучше вам помогать.
По завершению работы с виртуальным окружением можно просто набрать deactivate
,
либо закрыть окно терминала:
(env) $ deactivate
$ which python
/Users/and-semakin/.asdf/shims/python
И мы видим, что команда python
снова вызывает глобальный интерпретатор.
При этом виртуальное окружение осталось в своей директории, оно просто не
активно. В следующий раз, когда будет нужно поработать с виртуальным
окружением, не забудьте снова его активировать.
Виртуальное окружение можно полностью удалить, когда оно перестанет быть
нужным:
В идеале, у вас должна быть возможность в любой момент удалить и пересоздать
виртуальное окружение заново, для этого храните список зависимостей проекта и
содержите его в актуальном состоянии (например, в requirements.txt
).
В процессе разработки могут случиться всякие казусы с зависимостями,
и иногда проще пересоздать виртуальное окружение заново, чем пытаться
починить сломанное.
Вот так можно работать с виртуальными окружениями в Python. Всегда устанавливайте
зависимости проектов только в изолированные виртуальные окружения. Не смешивайте
зависимости разных проектов в одном окружении.
Когда в инструкции по установке библиотеки написано pip install ...
,
подразумевается, что у читателя есть понимание, что он делает. Думаю,
разработчики библиотек не пишут про создание виртуальных окружений
только потому, что это сильно раздуло бы все инструкции.
Ничего не устанавливайте в глобальный интерпретатор
Иногда возникает желание установить какой-нибудь пакет прямо в глобальный
интерпретатор, потому что по смыслу этот пакет вроде как должен быть вне
виртуальных окружений. Например, это может быть какая-нибудь программа,
типа poetry
,
docker-compose
,
youtube-dl
или
howdoi
. Руки набирают в терминал:
Установка начинается, прогресс-бары заполняются, но в итоге всё завершается
чем-то типа такого:
error: could not create '/lib/python2.7/site-packages/poetry': Permission denied
Можно попробовать установить, используя sudo
, и это сработает, но это
считается очень плохой практикой,
и я настоятельно рекомендую так не делать по нескольким причинам:
-
Угроза безопасности.
В секции про установку пакетов я упомянул, что для пакетов других форматов,
кроме wheel, могут потребоваться дополнительные действия. На самом деле,
при установке пакета форматаsdist
исполняется файлsetup.py
, в котором
потенциально могут содержаться любые действия — от честной установки пакета,
доrm -rf /
или установки криптомайнера в систему. Т.к. в PyPI пакет
загрузить может кто угодно, никогда нельзя быть уверенным, что именно сделает пакет
при установке. Выполнять такой скрипт с системными привилегиями (sudo
) —
не самый мудрый ход. -
Может нарушить целостность системы.
Часто в операционных системах принято устанавливать программы через
пакетный менеджер (будь тоapt
,dnf
илиpacman
). Этот же пакетный
менеджер затем может без следа удалить установленную программу, потому что он
ведёт учёт файлов — какой программе какие файлы принадлежит. Если начать
изменять файлы программ каким-либо образом, помимо пакетного менеджера,
то это может нарушить его работу.pip
, конечно, установит что нужно,
но после этого могут возникнуть проблемы с системным пакетным менеджером.
Как правильно:
-
сказать
pip
, чтобы он установил пакет не в директориюsite-packages
, а в
домашнюю директорию пользователя при помощи флага--user
:$ pip install --user poetry # без sudo!
Обязательно нужно убедиться, что директория, куда установится пакет,
перечислена в переменной$PATH
. Путь к директории можно получить при помощи
следующей команды:$ python -m site --user-base /Users/and-semakin/.local
К получившемуся пути нужно в конце добавить
/bin
для Linux и MacOS,
либоScripts
для Windows, так что
в моём случае (MacOS) в$PATH
нужно добавить вот такой путь:
/Users/and-semakin/.local/bin
.Подробнее про этот метод установки читайте здесь.
-
установить программу через пакетный менеджер ОС, например:
$ sudo dnf install python-poetry
Часто мейнтейнеры ОС создают обёртки для пакетов из PyPI, которые можно
установить при помощи системного пакетного менеджера. Как правило, такие
обёртки называютсяpython-<имя пакета>
илиpython3-<имя пакета>
.
Это делается как раз для того, чтобы дать пользователям возможность
устанавливать Python-программы, не нарушая работу пакетного менеджера ОС.
Кроме того, эти пакеты проходят проверку безопасности, так что риск получить
криптомайнер значительно ниже.
Выводы
- всегда устанавливайте зависимости проектов в отдельные виртуальные окружения;
- если нужно установить пакет “глобально”, то используйте либо
pip install --user ...
,
либо прибегните к помощи пакетного менеджера операционной системы; - никогда не используйте
sudo pip ...
— считайте, что это табу.
Да, виртуальные окружения — определенно не самая удобная часть разработки на
Python, и уж точно не самая простая тема, к этому просто нужно привыкнуть.
Несколько раз повторил, выработал привычку — в целом, ничего сложного.
Кроме того, экосистема Python развивается очень быстро, и я надеюсь,
что скоро правильная установка пакетов
и управление виртуальными окружениями станут намного легче.
Уже сейчас можно пользоваться такими инструментами,
которые в некоторой мере прячут от пользователя виртуальные окружения:
- poetry;
- pipenv.
Стабильных вам зависимостей и кода без багов!
Полезно почитать:
- Документация: https://docs.python.org/3/library/venv.html
Сегодня уже ни для кого не секрет, что для просмотра и редактирования текстовых и графических файлов совсем не обязательно устанавливать на компьютер соответствующие программы. Просмотр и редактирование данных поддерживают многие популярные облачные сервисы, но все они без исключения уступают ресурсу rollApp, представляющему собой настоящий каталок виртуальных приложений, которые можно запускать, используя самый что ни на есть обычный браузер.
Сейчас в базе сервиса имеется более 170 приложений и игр, причём большинство из них в плане функциональности практически ничем не уступает инсталлируемым программам. Здесь вы найдете игры, текстовые и графические редакторы, архиваторы и утилиты, средства для работы с аудио, образовательные программы и инструменты для разработчиков.
С их помощью вы можете просматривать, редактировать и сохранять данные, правда для этого вам придётся подключить к rollApp одно из облачных хранилищ. Это может быть Google Drive, Dropbox, Box, OneDrive, Яндекс.Диск и WebDAW.
Работать в виртуальных приложениях можно так же, как если бы они были установлены на локальном компьютере. Обработка данных выполняется на удалённом сервере, где располагается программное обеспечение, на ПК же пользователь имеет дело только с графическим интерфейсом.
Производительность виртуальных программ зависит по большей части от качества соединения, хотя некоторые программы, например, 3D-редакторы всё же могут предъявлять к графическим возможностям системы определённые требования.
Регистрация для работы с rollApp обязательна. Некоторые программы можно запускать в тестовом режиме, но тогда вы не сможете загружать и сохранять файлы, впрочем, есть и такие приложения, для работы в которых требуется платная подписка. Услуги сервиса предоставляются на платной основе, однако в течении 14-ти дней ими можно пользоваться бесплатно. Есть и другие, не столь существенные ограничения, например, пользователи, не имеющие премиум-подписки, не могут запускать более чем три приложения одновременно.
Виртуальные программы rollApp: www.rollapp.com
Загрузка…