"Начиная"

Что такое «среда Python»? (Для начинающих)

Четкое разделение ключевых понятий для демистификации процесса создания среды.

Поскольку у меня не было опыта в области компьютерных наук, и он научился программировать «на рабочем месте», весь процесс создания и запуска стабильной среды Python был пугающим. Появилось/появилось множество шагов, новая терминология (sys.path, «виртуальная среда»/«venv», устаревшая $PYTHONPATH и т. д.), а также множество инструментов (pip, pyenv, venv, conda, поэзия), которые должно быть проще, но, возможно, в процессе:

  • скрыть более упрощенную работу по настройке (особенно для новичка), чтобы вы никогда не понимали, что происходит
  • имеют различную область применения, так что некоторые инструменты делают одно (управление зависимостями или настройка виртуальной среды), другие — несколько (например, conda и поэзия), и поэтому трудно понять, что для чего следует использовать.

Это сборник моих заметок о глубоком погружении в среду Python в 2021 году с целью:

  • сам понимаю
  • уменьшить количество раз, когда я нажимаю на фиолетовые ссылки переполнения стека, потому что 4 года назад информация шла «в одно ухо и вылетало из другого»
  • подумайте об изменении того, что я узнал раньше (conda + setuptools) и никогда не задавался вопросом только потому, что «если это не сломано, не чините это»

Каковы компоненты стабильно функционирующей среды?

В каком-то смысле — какова цель? Большинство людей склонны согласиться с тем, что при написании кода на Python, который вы хотите повторно использовать или поделиться, забывая о самом коде, вам нужны следующие вещи:

  • легко работать и знать, сработало ли это, прежде чем оно продолжит работать (управление средой)
  • легко работать вместе с чем-то еще, что может использовать другую версию Python и другие пакеты (версия Python и управление зависимостями)
  • легко поделиться с другими людьми (сборка пакетов и распространение)
  • когда другие люди получают его, они могут запустить его без проблем (управление средой)
  • они могут запустить его, если они также зависят от чужого кода (управление зависимостями)
  • если вышеперечисленные вещи когда-либо становятся проблематичными, они либо легко решаются, либо разъясняются способы их решения (управление средой)

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

Управление средой (venv, conda, поэзия)

Это касается возможности настроить контейнер на вашем компьютере, который гарантирует, что все, что требуется для запуска вашего кода, останется прежним. Обычно это принимает форму структуры каталогов с тем, что вам нужно, но также может делать такие вещи, как установка стабильных направлений для вещей, которые вам нужны, которые находятся за пределами этого каталога. Сохранять стабильность — это здорово, потому что это гарантирует, что неизмененный код, написанный сегодня, будет работать на следующий день. Если и среда создается формульно, то и описывать ее можно формульно. Это здорово, потому что среда, которую вы используете для запуска своего кода, может быть затем выражена формулой, так что, если кто-то еще захочет запустить этот код, ему просто нужно следовать точному рецепту, чтобы иметь точно соответствующую среду и гарантировать, что она не «случайно». ' не работает для них.

Управление версиями Python (pyenv)

Python — это язык, и, как и все языки, он разрабатывается. Чтобы избежать полного хаоса из-за постоянно меняющегося языка, изменения/обновления дискретизируются, и каждому новому выпуску присваивается номер версии для его идентификации. Как указано выше, чтобы неизменный код продолжал работать, вам необходимо убедиться, что вы продолжаете использовать ту же версию Python — или, по крайней мере, до тех пор, пока вы не протестируете, что тот же код будет работать с другой (надеюсь, более новой) версией Python. Это может создать проблему, если у вас есть несколько проектов, каждый из которых использует разные версии python (либо по выбору, либо потому, что вам приходится это делать из-за зависимостей — подробнее об этом позже), и поэтому в идеале у нас может быть что-то, что может запускать разные версии python. python, когда мы работаем над разными проектами. Это управление версиями Python.

Установка пакета (pip, conda, поэзия)

Вероятно, не весь код, который вы напишете, будет вашим, и поэтому вы захотите использовать часть уже написанного кода. Python поставляется с предустановленным набором компонентов, которые составляют Стандартную библиотеку Python, но есть множество других пакетов, которые вы скорее используете, чем пытаетесь написать сами (NumPy, pandas, SciPy и т. д.). Нам нужен способ перенести их на наш компьютер — или, точнее, в нашу среду, которую мы создали внутри нашего компьютера. К счастью, как объясняет это видео, есть люди, которые работали над стандартизацией этого и создали базу данных всех этих пакетов под названием PyPI. После того, как код последовательно зарегистрирован там, нам нужен способ пойти туда, взять его и установить в нашу хорошо контролируемую среду. Нам также нужен способ гарантировать, что если у нас есть несколько проектов, подобных описанным выше, которые используют разные версии Python, то мы можем установить правильную соответствующую версию потенциально одного и того же пакета в соответствующие среды. Это установка пакетов.

Управление зависимостями (конда, поэзия)

Приведенная выше установка пакета звучит достаточно просто:

  • дайте ему список требований
  • он идет в базу данных в Интернете и собирает их
  • он устанавливает их, используя стандартные инструкции, которым они все соответствуют.

но, как и в случае с самим языком python, эти другие пакеты постоянно меняются. На самом деле, поскольку python постоянно обновляется, эти другие «сторонние пакеты» обновляются — потому что их нужно тестировать и обновлять, чтобы использовать более новые версии базовой стандартной библиотеки python. И потенциально использовать новые функции для расширения или улучшения существующих функций. При большом количестве обновлений пакетов в случайные дни и с разными требованиями к тому, от чего они зависят, не так уж сложно получить 2 пакета, которые зависят от конфликтующих версий другой общей зависимости. Разрешение этих конфликтов таким образом, чтобы все зависимости, которые нам нужны, с учетом ограничений, которые мы, возможно, указали, могли быть захвачены и установлены, — это управление зависимостями.

Создание и распространение пакетов (инструменты установки, поэзия)

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

  • как установить то, что мы написали (стандартизированный формат кода через файлы «.whl»)
  • с каким кодом ваш код может играть в мяч (набор ограничений зависимостей, которые есть у нашего кода — если они есть)

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

Кажется, это слишком много, чтобы просто написать несколько строк на питоне.

Многочисленные вышеперечисленные шаги могут создать впечатление, что это невероятно сложная задача — просто написать немного Python. Очевидно, что написать немного Python локально, как правило, так же просто, как открыть командную строку и ввести python (Mac поставляется с предустановленной программой). Но чтобы написать что-то более существенное, это кажется кучей усилий и сложностей, особенно для тех, кто только начинает и понятия не имеет, что означают многие из «самых основных» слов. Чтобы усложнить ситуацию, вышеупомянутые инструменты как бы скрывают то, что на самом деле происходит, и могут даже сделать более запутанным понимание фундаментального вопроса:

"Как мы можем точно контролировать, что происходит, когда вы вводите слово python в командную строку, чтобы у нас был доступ ко всему, что нам нужно (модули, пакеты), и этот доступ оставался "детерминированным"?"

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

  • системный путь ($PATH)
  • переменная sys.path Python и «путь поиска модуля»

Давайте посмотрим, как работает системная переменная $PATH в следующей статье, и подробно рассмотрим, как популярные инструменты Python (pyenv, conda, поэзия) манипулируют ею, чтобы упростить нашу жизнь, когда дело доходит до управления версиями Python.



Python, системный путь и как conda и pyenv манипулируют им
Глубокое погружение в то, что происходит, когда вы вводите «python
в оболочке, и как популярные инструменты управления средой манипулируют… markjamison03.medium.com»