Writing your first Script
Before we write anything, let’s create a folder to hold your Python scripts.
Usually you would choose a hierarchy that’s sensible for you (for example I use Documents/programming/python in my home directory as the root for all of my Python projects!).
For the purposes of this workshop, let’s use your Desktop folder in your U drive and create a folder called
*nix users
Similar to above, but place the python_workshop folder in your home folder (e.g. /home/ubuntu for openstack users).
NB
It’s a slightly confusing convention, but a user’s home folder is the path /home/username , not simply /home .
What is a Python Script?
A Python script is just a plain text file, and the convention is to use the extension .py (instead of e.g. .txt ) to let programs know that it holds Python code.
Python code is very close to something called pseudo-code, which is what people use when detailing the main components of an algorithm.
For example, the pseudo-code for the factorial function (e.g. 3! = 3 x 2 x 1) is
while the python code is
What this simple example illustrates, is that Python is extremely readable; it just takes becoming familiar with a few base syntax rules (
grammar).
We’ll be speaking Python in no time!
Worked Exercise : Hello, world!
We’ll start by creating a blank Python script file.
Creating a file
We’re going to name our first script file exercise_hello_world.py and keep it inside the newly created python_workshop folder.
To do this, open Notepad++ . You should see a blank file (that may be named “new 1”, or “new 2” etc, depending on if you closed any tabs!).
If you don’t see a blank file, select File->New from the menu bar.
Then select File->Save As , navigate to the python_workshop folder we created a few minutes ago, and set the file name to exercise_hello_world.py and click Save.
Now that we have a blank Python script file, lets start adding some code!
Initial content
First of all, enter:
replacing the text in the line starting # Author with your details.
Running the script with Python: The Terminal
Now let’s see what running this through Python does!
Start a customized command prompt (reminder: in the Windows File Explorer, find the WinPython3 folder on the C: drive, and click on WinPython Command Prompt.exe).
A terminal window should pop up, that looks a little bit like
Reminder: Basic terminal usage
You were advised to have basic knowledge of using a terminal (Windows Command Prompt/Linux Terminal/MacOS Terminal), you are about to see out why!
Here’s a recap of the things you’re most likely to need.
Windows MacOS / Linux What it does `cd FOLDER_NAME` `cd FOLDER_NAME` Change directory to FOLDER_NAME `dir FOLDER_NAME` `ls FOLDER_NAME` List folder contents; if FOLDER_NAME
is omitted, list current folder contents`..` `..` Reference to parent folder. E.g. `cd ..`
is how you would navigate from `/a/b/c/` to
`/a/b/` if you are currently in `/a/b/c/`.`mkdir FOLDER_NAME` `mkdir FOLDER_NAME` Create a folder called FOLDER_NAME
Quick note on terminology
Folder and directory refer to the same thing, while full path or absolute path means the full directory location. E.g. if you’re currently in your Desktop folder, the folder is Desktop, but the full path is something like /users/joe/Desktop . If you’re on Windows the path starts with a drive letter too, like “C:” or “U:”, and the forward-slashes will be backslashes instead.
Console and terminal (and sometimes shell) are usually used interchangeably to mean the same thing; the text-based interface where commands can be entered. In windows, the built-in console is also called the “command prompt” and is started using cmd.exe .
For our purposes, we’re going to be mainly interested in the terminal console which is where we type commands like cd , or dir .
For interactive Python snippet testing we can also use the Interactive Python console, which is where we can directly type python commands. You might encounter this later; for now just be aware that there are these two types of console.
Now using the terminal command to change directory, cd , navigate to your Desktop directory.
You can verify that it contains your new python_workshop folder by using the windows terminal command dir :
Разработка надёжных Python-скриптов
Python — это язык программирования, который отлично подходит для разработки самостоятельных скриптов. Для того чтобы добиться с помощью подобного скрипта желаемого результата, нужно написать несколько десятков или сотен строк кода. А после того, как дело сделано, можно просто забыть о написанном коде и перейти к решению следующей задачи.
Если, скажем, через полгода после того, как был написан некий «одноразовый» скрипт, кто-то спросит его автора о том, почему этот скрипт даёт сбои, об этом может не знать и автор скрипта. Происходит подобное из-за того, что к такому скрипту не была написана документация, из-за использования параметров, жёстко заданных в коде, из-за того, что скрипт ничего не логирует в ходе работы, и из-за отсутствия тестов, которые позволили бы быстро понять причину проблемы.
При этом надо отметить, что превратить скрипт, написанный на скорую руку, в нечто гораздо более качественное, не так уж и сложно. А именно, такой скрипт довольно легко превратить в надёжный и понятный код, которым удобно пользоваться, в код, который просто поддерживать как его автору, так и другим программистам.
Автор материала, перевод которого мы сегодня публикуем, собирается продемонстрировать подобное «превращение» на примере классической задачи «Fizz Buzz Test». Эта задача заключается в том, чтобы вывести список чисел от 1 до 100, заменив некоторые из них особыми строками. Так, если число кратно 3 — вместо него нужно вывести строку Fizz , если число кратно 5 — строку Buzz , а если соблюдаются оба этих условия — FizzBuzz .
Исходный код
Вот исходный код Python-скрипта, который позволяет решить задачу:
Поговорим о том, как его улучшить.
Документация
Я считаю, что полезно писать документацию до написания кода. Это упрощает работу и помогает не затягивать создание документации до бесконечности. Документацию к скрипту можно поместить в его верхнюю часть. Например, она может выглядеть так:
В первой строке даётся краткое описание цели скрипта. В оставшихся абзацах содержатся дополнительные сведения о том, что именно делает скрипт.
Аргументы командной строки
Следующей задачей по улучшению скрипта станет замена значений, жёстко заданных в коде, на документированные значения, передаваемые скрипту через аргументы командной строки. Реализовать это можно с использованием модуля argparse. В нашем примере мы предлагаем пользователю указать диапазон чисел и указать значения для «fizz» и «buzz», используемые при проверке чисел из указанного диапазона.
Эти изменения приносят скрипту огромную пользу. А именно, параметры теперь надлежащим образом документированы, выяснить их предназначение можно с помощью флага —help . Более того, по соответствующей команде выводится и документация, которую мы написали в предыдущем разделе:
Модуль argparse — это весьма мощный инструмент. Если вы с ним не знакомы — вам полезно будет просмотреть документацию по нему. Мне, в частности, нравятся его возможности по определению подкоманд и групп аргументов.
Логирование
Если оснастить скрипт возможностями по выводу некоей информации в ходе его выполнения — это окажется приятным дополнением к его функционалу. Для этой цели хорошо подходит модуль logging. Для начала опишем объект, реализующий логирование:
Затем сделаем так, чтобы подробностью сведений, выводимых при логировании, можно было бы управлять. Так, команда logger.debug() должна выводить что-то только в том случае, если скрипт запускают с ключом —debug . Если же скрипт запускают с ключом —silent — скрипт не должен выводить ничего кроме сообщений об исключениях. Для реализации этих возможностей добавим в parse_args() следующий код:
Добавим в код проекта следующую функцию для настройки логирования:
Основной код скрипта при этом изменится так:
Если скрипт планируется запускать без прямого участия пользователя, например, с помощью crontab , можно сделать так, чтобы его вывод поступал бы в syslog :
В нашем небольшом скрипте неоправданно большим кажется подобный объём кода, нужный только для того, чтобы воспользоваться командой logger.debug() . Но в реальных скриптах этот код уже таким не покажется и на первый план выйдет польза от него, заключающаяся в том, что с его помощью пользователи смогут узнавать о ходе решения задачи.
Тесты
Модульные тесты — это полезнейшее средство для проверки того, ведёт ли себя приложения так, как нужно. В скриптах модульные тесты используют нечасто, но их включение в скрипты значительно улучшает надёжность кода. Преобразуем код, находящийся внутри цикла, в функцию, и опишем несколько интерактивных примеров её использования в её документации:
Проверить правильность работы функции можно с помощью pytest :
Для того чтобы всё это заработало, нужно, чтобы после имени скрипта шло бы расширение .py . Мне не нравится добавлять расширения к именам скриптов: язык — это лишь техническая деталь, которую не нужно демонстрировать пользователю. Однако возникает такое ощущение, что оснащение имени скрипта расширением — это самый простой способ позволить системам для запуска тестов, вроде pytest , находить тесты, включённые в код.
В случае возникновения ошибки pytest выведет сообщение, указывающее на расположение соответствующего кода и на суть проблемы:
Модульные тесты можно писать и в виде обычного кода. Представим, что нам нужно протестировать следующую функцию:
В конце скрипта добавим следующие модульные тесты, использующие возможности pytest по использованию параметризованных тестовых функций:
Обратите внимание на то, что, так как код скрипта завершается вызовом sys.exit() , при его обычном вызове тесты выполняться не будут. Благодаря этому pytest для запуска скрипта не нужен.
Тестовая функция будет вызвана по одному разу для каждой группы параметров. Сущность args используется в качестве входных данных для функции parse_args() . Благодаря этому механизму мы получаем то, что нужно передать функции main() . Сущность expected сравнивается с тем, что выдаёт main() . Вот что сообщит нам pytest в том случае, если всё работает так, как ожидается:
Если произойдёт ошибка — pytest даст полезные сведения о том, что случилось:
В эти выходные данные включён и вывод команды logger.debug() . Это — ещё одна веская причина для использования в скриптах механизмов логирования. Если вы хотите узнать подробности о замечательных возможностях pytest — взгляните на этот материал.
Итоги
Сделать Python-скрипты надёжнее можно, выполнив следующие четыре шага:
- Оснастить скрипт документацией, размещаемой в верхней части файла.
- Использовать модуль argparse для документирования параметров, с которыми можно вызывать скрипт.
- Использовать модуль logging для вывода сведений о процессе работы скрипта.
- Написать модульные тесты.
Вокруг этого материала развернулись интересные обсуждения — найти их можно здесь и здесь. Аудитория, как кажется, хорошо восприняла рекомендации по документации и по аргументам командной строки, а вот то, что касается логирования и тестов, показалось некоторым читателям «пальбой из пушки по воробьям». Вот материал, который был написан в ответ на данную статью.
Уважаемые читатели! Планируете ли вы применять рекомендации по написанию Python-скриптов, данные в этой публикации?
Cкрипты — Python: Настройка окружения
В интерпретируемых языках от написания кода до запуска — всего один шаг. Ничего не нужно компилировать в машинный код.
Всю работу делает интерпретатор, которому достаточно подать на вход скрипт — программу на интерпретируемом языке. Внутри этой программы записаны простые последовательности команд, которые компьютеру нужно выполнить.
Если на каком-то языке удобно писать скрипты, его называют «скриптовым языком» или «языком для написания сценариев».
Скрипты на Python
Python отлично подходит на роль скриптового языка. Последовательность команд в простых сценариях не нужно никак оформлять и запускать скрипты максимально просто. Мы просто пишем команды одну за другой в файл:
Затем мы просто вызываем интерпретатор с полученным файлом на входе:
У Python много полезных модулей и функций, входящих в поставку. Поэтому его часто используют для автоматизации различных задач, которые не хочется выполнять вручную при работе на компьютере. К тому же написание скриптов — отличная отправная точка для тех, кто только начинает знакомиться с программированием.
Скрипты и shebang
В Linux, macOS, BSD и других unix-подобных операционных системах командные оболочки умеют запускать скрипты на любых языках, в том числе и на Python. При этом скрипты сообщают оболочке, какой интерпретатор нужно вызывать для выполнения сценария.
Интерпретатор указывается специальной строкой в самой первой строчке файла скрипта, которая называется shebang. Это название произошло от первых двух символов такой строчки: # называется sharp, а ! — bang.
Типичный shebang выглядит так:
После символов #! идет путь до интерпретатора. При запуске скрипта с shebang командная оболочка читает первую строку и пробует запустить указанный интерпретатор. Если скрипту с указанным shebang дать права на исполнение, то интерпретатор в командной строке можно не указывать:
Shebang и разные версии Python
В целом shebang — штука довольно простая, когда интерпретатор в системе ровно один. Но мы с вами знаем, что версий Python в системе может быть установлено несколько. Более того, в виртуальном окружении путь к интерпретатору будет отличаться от /usr/bin и будет разным в разных окружениях.
Как сделать так, чтобы скрипт запускался всегда с нужной версией Python? Нужно всего лишь не указывать путь до команды python напрямую, а использовать программу env .
Эта программа умеет находить и запускать программы с учетом переменных окружения. При активации виртуального окружения модифицируется переменная $PATH , поэтому env будет запускать именно ту версию интерпретатора, которая нам нужна. Нужная версия просто найдется раньше, потому что путь до исполняемых файлов окружения добавляется в начало $PATH .
А теперь рассмотрим правильный способ указывать shebang в проектах на python:
Открыть доступ
Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно
Как запустить скрипт Python (пошаговое руководство)
В этом руководстве рассказывается о том, как создать и как запустить скрипт на Python.
Программирование или скриптинг?
Обработку данных на основе Python можно разбить на маленькие этапы. Например:
- Импорт numpy и pandas.
- Загрузка необработанных данных из .csv файла в DataFrame.
- Загрузка необработанных данных из словаря Python в другой DataFrame.
- Объединение двух фреймов данных.
- Сортировка значений.
- Заполнение пустых значений.
- И так далее…
Можно выполнить эти задачи вручную. Или поместить эти команды в скрипт Python . Это и есть скриптинг.
Скрипт Python похож на сценарий фильма. В нем вы точно записываете, должен делать компьютер.
Как создать скрипт Python
Вы можете использовать любой код, написанный ранее в Jupyter. Например, вот мой Jupyter Notebook .
Как превратить код Python для Jupyter Notebook в скрипт Python?
Для этого нужно скопировать все строки из Jupyter Notebook и поместить их в текстовый редактор. После чего сохранить в файл с расширением .py.
Создадим скрипт Python
Шаг №1 — откройте текстовый редактор.
Если вы находитесь на удаленном сервере, откройте свой любимый текстовый редактор. Для этого введите команду:
Вы можете использовать любой текстовый редактор (vim, nano и т. д.).
Но если вы хотите что-то более продвинутое, я настоятельно рекомендую Sublime Text 3.
Шаг №2 — скопируйте и вставьте код!
Скопируйте и вставьте весь код из Jupyter Notebook в текстовый редактор:
Шаг №3 — Сохраните файл как файл .py!
Нажмите кнопку 10-Quit в правом нижнем углу (или Esc+0 на клавиатуре).
После чего mcedit спросит, хотите ли вы сохранить файл? Нажмите: Yes! Затем задайте имя новому текстовому файлу. Скрипты Python имеют собственное расширение: .py.
Нажмите ОК . Теперь текстовый файл теперь стал скриптом Python.
Шаг № 4 — Снова откройте текстовый файл
Вернемся к редактированию файла, набрав команду:
Теперь код выглядит более похожим на Python с различной подсветкой:
Это потому, что вы добавили расширение .py . В результате этого редактор mcedit распознал текстовый файл как скрипт Python.
Шаг № 5 — Добавьте Shebang!
Shebang — это строка кода, которую нужно поместить в самом начале скрипта. Его задача – сообщить ОС, что у вас есть исполняемый файл Python3.
Строка shebang для скриптов Python3 выглядит следующим образом:
Если честно, ваш скрипт будет работать и без него. Несмотря на это, я предпочитаю добавлять Shebang по нескольким причинам:
- В среде разработки, в которой доступно сразу несколько версий Python, Shebang прояснит, какой интерпретатор должен выполнить скрипт.
- Когда один из ваших коллег откроет скрипт, он сразу увидит, на каком языке он написан.
Дополнительно: шаг № 6 — сделать скрипты на Python исполняемыми
После добавления Shebang, снова сохраните файл и попробуйте запустить скрипт, введя команду:
В некоторых случаях (в зависимости от конфигурации используемого сервера) вы получите ошибку прав доступа:
В Python подобная ошибка прав доступа не возникает. Если вы не столкнулись с этой проблемой, просто перейдите к шагу № 7.
Если у вас возникла ошибка прав доступа, в командной строке введите этот код:
Затем введите свой пароль.
Шаг №7 — запустите скрипт на Python!
Запустите скрипт, введя команду:
Это означает, что ваш скрипт на Python запущен. Но вы не видите никакого результата на экране.
Шаг № 8 — почему я ничего не вижу?
В большинстве случаев, когда вы конвертируете проект Jupyter Notebook в скрипт Python, вы не увидите на экране ничего. Это потому, что последняя строка вашего кода была такой:
Вернитесь к своему скрипту и измените последнюю строку на эту:
Нажмите 10-Quit и Save.
Перезапустите скрипт, введя для этого команду:
Шаг № 9 — Вы создали скрипт на Python
Вы создали скрипт на Python, и он работает. Но вы все равно захотите использовать Jupyter Notebook. Так как он является идеальным инструментом для тестирования и настройки процессов. Поэтому:
- Я создаю прототип проекта на Python в Jupyter Notebook. Затем создаю код и выясняю, какие шаги необходимы.
- Затем удаляю ненужные фрагменты кода и импортированные пакеты, сортирую задачи Python в порядке их выполнения.
- Добавляю комментарии к коду.
- Перемещаю все в текстовый редактор (Sublime Text или mcedit) и создаю скрипт Python, который можно автоматизировать.
Заключение
Написание и запуск скриптов Python это не магия. Если вы знаете, как писать код на Python, то сможете освоить и скрипты