- Как запустить скрипт Python
- Что такое оболочка?
- Что такое терминал?
- Что такое оболочка Python?
- Как пользоваться оболочкой Python?
- Что можно делать в оболочке Python?
- Как запустить скрипт Python
- Заключение
- xonsh — python как замена shell
- Установка
- venv
- Установка pyenv
- Запуск
- Настройка
- Использование виртуальных окружений
- Грабли
- Вывод
- Дополнения в комментариях
Как запустить скрипт Python
Какой бы язык программирования вы не начали изучать, вашей первой программой, скорее всего, будет «Hello World!».
Допустим, вы хотите написать такую программу на Python. Это можно сделать двумя способами: писать сразу в оболочке Python либо написать скрипт в редакторе кода и затем запускать в терминале.
Что такое оболочка?
Операционная система состоит из множества программ. Они выполняют различные задачи: управление файлами, памятью, ресурсами. Также они обеспечивают беспроблемный запуск ваших приложений.
Что бы мы ни делали на компьютере — от анализа данных в Excel до игр — все облегчается операционной системой.
Программы операционной системы делятся на два вида: программы оболочки и ядра.
Программы ядра выполняют такие задачи, как создание файла или отправка прерываний. Задача оболочки — принимать инпут, определять, какую программу ядра требуется запустить для обработки этого инпута, запускать ее и показывать результат.
Оболочка также называется командным процессором.
Что такое терминал?
Терминал — это программа, которая взаимодействует с оболочкой и позволяет нам коммуницировать с ней при помощи текстовых команд. Поэтому его также называют командной строкой.
Чтобы открыть терминал в Windows, нажмите клавиши Windows + R , затем наберите cmd и нажмите Enter. В Linux терминал открывается сочетанием клавиш Ctrl + Alt + T .
Что такое оболочка Python?
Python — это интерпретируемый язык программирования. Это значит, что интерпретатор Python читает строку кода, выполняет эту строку, а затем, если на этом шаге нет ошибок, процесс повторяется.
Оболочка Python дает вам интерфейс командной строки. С его помощью можно интерактивно передавать команды непосредственно в интерпретатор Python.
Подробнее об оболочке Python можно почитать в документации.
От редакции Pythonist. Об интерпретаторах Python можно почитать в статье «Топ-7 бесплатных компиляторов и интерпретаторов Python».
Как пользоваться оболочкой Python?
Чтобы запустить оболочку Python, просто введите python в терминале и нажмите Enter.
C:\Users\Suchandra Datta>python Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>>print("hello world!")
Интерактивная оболочка еще называется REPL (read-evaluate-print loop — «цикл „чтение — вычисление — вывод“». Она читает команду, оценивает и выполняет ее, выводит результат (если он есть) и повторяет этот процесс, пока вы не выйдете из оболочки.
Выйти из оболочки можно по-разному:
- нажать Ctrl+Z в Windows или Ctrl+D в Unix-подобных системах
- выполнить команду exit()
- выполнить команду quit()
C:\Users\Suchandra Datta>python Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> print("HELLO WORLD") HELLO WORLD >>> quit() C:\Users\Suchandra Datta>
C:\Users\Suchandra Datta>python Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> exit() C:\Users\Suchandra Datta>
C:\Users\Suchandra Datta>python Python 3.8.3 (tags/v3.8.3:6f8c832, May 13 2020, 22:37:02) [MSC v.1924 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> ^Z C:\Users\Suchandra Datta>
Что можно делать в оболочке Python?
В оболочке можно делать практически все, что вообще позволяет делать язык Python: использовать переменные, циклы, условия для определения функций и т. д.
Символы >>> — это приглашение оболочки, тут вы можете вводить свои команды. Если ваши команды занимают несколько строк, например, при определении цикла, оболочка выводит троеточие … , которое сигнализирует о продолжении строки.
Давайте рассмотрим пример:
>>> >>> watch_list = ["stranger_things_s1", "stranger_things_s2", "stranger_things_s3","stranger_things_s4"] >>> >>>
Здесь мы определили список сериалов прямо в оболочке Python.
Теперь давайте определим функцию. Она будет принимать наш список сериалов и возвращать один из них случайным образом.
>>> def weekend_party(show_list): . r = random.randint(0, len(show_list)-1) . return show_list[r] .
Обратите внимание на троеточия в начале строк.
Наконец, чтобы запустить функцию в оболочке, мы просто вызываем ее так же, как делали бы это в скрипте:
>>> weekend_party(watch_list) 'stranger_things_s1' >>> >>> >>> weekend_party(watch_list) 'stranger_things_s3' >>> >>> >>> weekend_party(watch_list) 'stranger_things_s2' >>> >>> >>> weekend_party(watch_list) 'stranger_things_s2' >>> >>> >>> weekend_party(watch_list) 'stranger_things_s3' >>>
В оболочке можно просматривать модули Python:
>>> >>> >>> import numpy >>> numpy.__version__ '1.20.1' >>>
Посмотреть, какие методы и атрибуты предлагает модуль, можно при помощи метода dir() :
>>> >>> x = dir(numpy) >>> len(x) 606 >>> x[0:3] ['ALLOW_THREADS', 'AxisError', 'BUFSIZE']
Мы видим, что всего Numpy имеет 606 методов и свойств.
Как запустить скрипт Python
В оболочке Python можно выполнять простые программы или заниматься отладкой отдельных частей сложных программ.
Но по-настоящему большие и сложные программы пишутся в редакторе кода. Они сохраняются в отдельных файлах с расширением .py. Их называют скриптами (сценариями) Python. Эти программы можно запускать на выполнение в терминале. Для этого используется команда Python.
Стандартный синтаксис следующий:
Все команды, которые мы выполняли в оболочке, можно записать в скрипт и запустить в терминале.
Заключение
Итак, вы познакомились с понятиями оболочки и терминала, а также научились пользоваться оболочкой Python. Мы также разобрали, как запустить скрипт Python в командной строке.
xonsh — python как замена shell
Удивительно, на на хабре до сих пор нет поста о такой, весьма интересной, замене шеллу как xonsh (github), с моей точки зрения синтаксис всяких shell’ов ужасен и не вижу никаких оснований сохранять его в 21 веке, а Python, в свою очередь, обладает прекрасным синтаксисом и массой других преимуществ, поэтому, на мой взгляд, он и должен быть языком автоматизации по умолчанию, чего и пытаеся достичь xonsh.
Какое-то время использую xonsh, поэтому думаю, что могу рассказать о нём достаточно для того, чтобы начать пользоваться.
- xonsh это только про Python 3, но это норма.
- xonsh ещё не релизнулся (версия 0.8.3 на момент написания), видимо по мнению разработчиков ещё не все желаемые фичи реализованы, но по моим ощущениям всё работает (если разобраться с отличиями, о чём ниже).
Основная особенность xonsh в том, что он «магически» угадывает что вы ввели — команду питона или шелла, и это работает вполне хорошо.
Вставлять питонные код в команды шелла можно с помощью собаки.
Не буду подробно останавливаться, на том, какие есть возможности в xonsh, это понятно и наглядно описано в документации и всяких статьях, с моей точки зрения достаточно уже того, что вы можете получить нормальный синтаксис циклов в шелле:
worldmind@x ~ $ for i in range(3): . echo $SHELL
Поэтому я постараюсь сосредоточиться на том, что не описано или описано плохо.
Установка
Я буду описывать установку (для Debian/Ubuntu) не требующую права суперпользователя, хотя я только недавно перешёл на такую схему, раньше я ставил в системные папки, прописывал его в /etc/shells и менял шелл командой chsh , но на первый взгляд всё работает также и при новом способе и он мне кажется более правильным, не хочется засорять систему пакетами не из репозиториев, но тут каждый решает для себя сам.
sudo apt-get install python3-pip
Ставим xonsh (без sudo), я привожу команду которая устанавливает все опциональные зависимости, чтобы получить все плюшки задуманные авторами, если кто-то хочет минимальную установку, то можно удалить квадратные скобки с содержимым:
pip3 install --user xonsh[ptk,pygments,proctitle,linux]
Скорее всего у вас уже, где-нибудь в .profile в PATH добавляются пути к локальной папке с бинарниками $HOME/.local/bin , но они добавляются только при их наличии, поэтому нужно перезапустить терминал, чтобы этот код отработал и бинарник xonsh можно было запустить и посмотреть.
Обновление стандартно:
pip3 install --user xonsh --upgrade
venv
Ставим venv если хотим пользоваться соответствующим функционалом (см. далее про vox):
sudo apt-get install python3-venv
Всякие venv заточены под конкретные шеллы, поэтому xonsh предлагает свою обёртку называемую vox, но для комфортного использования стоит устанавливать расширение avox:
pip3 install --user xontrib-avox
Установка pyenv
Если есть необходимость в виртуальных окружениях с произвольной версией питона, то нужно склонировать pyenv предварительно установив зависимости для сборки питона:
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
Далее в примере конфига можно узреть установку пары переменных окружения для использования pyenv.
Запуск
Теперь у нас всё установлено и осталось сделать xonsh шеллом, для того, чтобы не менять ничего вне юзерской папки я использую следующий код (по мотивам SO) для баша (если у вас другой шелл, то вы знаете что делать, но не используйте .profile т.к. xonsh его тоже читает) добавленный в .bashrc :
# set default shell without editing /etc/shells if [ "$" = "unset" ] ; then export SHELL=$HOME/.local/bin/xonsh exec $HOME/.local/bin/xonsh -l fi
Перезапускаем шелл и, если всё прошло удачно, вы уже в xonsh т.е. по сути в питон консоли и можете например производить вычисления прямо в командной строке, например узнать сколько будет 2+2 .
Настройка
Прежде чем начать пользоваться, стоит создать конфигурационный файл .xonshrc :
aliases['g'] = 'git' import os local_bin = '<>/.local/bin'.format($HOME) if os.path.isdir(local_bin): $PATH.append(local_bin) $PYENV_ROOT = '%s/.pyenv' % $HOME $PATH.insert(0, '%s/bin' % $PYENV_ROOT) xontrib load vox $PROJECT_DIRS = ["~/projects"] xontrib load avox
Перезапускам шелл для применения новых настроек.
Стоит обратить внимание на человеческую модель данных — алиасы это словарь, пути это список, вроде очевидно, но почему-то не всегда оно так.
Также, мы в конфиге импортировали модуль os это значит что он уже будет доступен в нашем шелле, таким образом можно наимпортить нужных модулей и получить своё, удобное окружение.
Начало приведённого файла больше для демонстрации возможностей, а вот последние три строки позволяют удобно использовать виртуальные окружения, пример использования которых далее.
Использование виртуальных окружений
Создаём папку проекта (avox ожидает что все проекты лежат в $PROJECT_DIRS ):
Создаём виртуальное окружение для этого проекта:
Благодаря настроенному дополнению avox нам достаточно перейти в папку проекта чтобы активировать виртуальное окружение, никаких странных source ./bin/activate выполнять не нужно:
worldmind@x ~ $ cd projects/test/ (test) worldmind@x ~/projects/test $ pip install see . (test) worldmind@x ~/projects/test $ python -c 'import see'
По выходу из папки виртуальное окружение деактивируется:
(test) worldmind@x ~/projects/test $ cd worldmind@x ~ $ python3 -c 'import see' err>out | fgrep 'NotFound' ModuleNotFoundError: No module named 'see'
Заодно можно увидеть более человеческую работу с перенаправлением потоков ввода-вывода, кто никогда не забывал как это делать во всяких башах пусть первым кинет в меня коментом.
Для полноты картины хотело бы, чтобы в этих виртуальных окружениях можно было бы использовать произвольную версию питона, например установленную через pyenv, но пока не срослось, а самому подкостылить руки не дошли.
UPD: Не так давно xonsh научили использовать произвольную версию питона в виртуальных окружениях.
Устанавливаем желаемую версию питона (список доступных pyenv install —list ):
Создаём виртуальное окружение с ней:
mkdir projects/projectwith3.7 vox new -p $PYENV_ROOT/versions/3.7.2/bin/python projectwith3.7
(projectwith3.7) worldmind@x ~/projects/projectwith3.7 $ python --version Python 3.7.2
Грабли
Единственное на что я накнулся это отличия в эскейпинге:
find . -name data.txt -exec echo <> \;
не будет работать, ибо эскейпинг обратным слэшем не работает в xonsh и фигурные скобки имеют специальное значение, нужно использовать кавычки, например так:
find . -name .xonshrc -exec echo '<>' ';'
некоторые отличия от bash есть в виде таблицы в документации.
Вывод
Мне кажется, что xonsh это хорошой претендент на нормальный шелл будущего для всех, а особенно он должен понравиться питонистам. Начните пользоваться (установка без sudo упрощает откат назад, можно просто удалить папку), чтобы понять всё ли там есть лично для вас, может это то, что вы искали, но боялись установить.