Пишем инструменты командной строки на python с помощью click

Обработка ошибок

Добавим заведомо неверное условие в команду. Например, пусть
листинг выполняется не для текущей директории а для несуществующей.

2
ls: cannot access ‘not_exist’: No such file or directory

Обратите внимане, что Python в этом примере не выдаёт никаких ошибок

Чтобы Python информировал об ошибках во внешних командах используйте опцию
check=True

python3 subprocess_lesson.py

Traceback (most recent call last):
File «subprocess_lesson.py», line 3, in <module>
p1 = subprocess.run(, capture_output=True, text=True, check=True)
File «/usr/lib/python3.8/subprocess.py», line 512, in run
raise CalledProcessError(retcode, process.args,
subprocess.CalledProcessError: Command » returned non-zero exit status 2.

Обратите внимане, что теперь Python выдаёт ошибку, а до print(p1.returncode) и
print(p1.stderr) дело уже не доходит

python3 subprocess_lesson.py

None

Парсим опциональные параметры с click

Как вы, возможно, догадались, тестовый API ограничивает нас в возможностях. Поэтому, прежде чем мы продолжим, зарегистрируйтесь и получите настоящий API-ключ.

Первое, что нам нужно изменить, — URL, откуда берутся данные о текущей погоде. Это можно сделать, изменив значение переменной в функции на URL, указанный в документации OpenWeatherMap:

Это изменение приведёт к неработоспособности нашего CLI, так как указанный API-ключ не работает с реальным API. Поэтому давайте добавим новый параметр в наш CLI, который позволит нам указывать API-ключ. Но сначала мы должны решить, будет ли этот параметр аргументом или опцией. Мы сделаем его опцией, так как добавление параметра вроде делает его более явным и говорящим за себя.
Мы хотим, чтобы наша программа запускалась таким образом:

Проще простого. Посмотрим, как добавить опцию к нашей существующей команде:

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

Как было сказано ранее, click создаёт аргумент для передачи в функцию из длинного варианта имени. В случае с опцией он убирает впередистоящие тире и переводит её в snake case. Таким образом, становится .

Чтобы всё заработало, осталось лишь передать API-ключ в функцию .

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

Deploy на удаленный хост

Развернуть и отправить код на сервер возможно прямиком из PyCharm.

Инструмент не доступен в бесплатной комьюнити-версии

Чтобы добавить удалённый сервер, первым делом перейдём в:

Здесь сначала вводим имя, а затем настраиваем данные сервера. Потом вводим имя и пароль пользователя и проверяем соединение при помощи кнопки .

Для проверки соединения с удаленным хостом нажмите «Test Connection».

Переключаемся на следующую вкладку под названием Mappings. Мапы здесь — это соответствия между путями на вашем компьютере и путями на сервере. Производим и применяем настройки.

Во вкладке Mapping — соответствия между путями на вашем компьютере и путями на сервере.

Теперь можно производить deploy:

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

Автоматический deploy на сервер по умолчанию в IDE PyCharm

Изучаем Python: куда дальше?

Чтобы быстро усвоить азы Питона, предоставленного в уроке материала достаточно. Конечно, этого мало, дабы стать специалистом. Поэтому придется самостоятельно дома или при помощи дополнительных курсов углублять знания. Выбор за вами, но некоторые рекомендации мы дадим.

Какие темы освоить в первую очередь? Приводим список тем и команд для новичков:

  • типы данных в Python;
  • необязательные и ключевые аргументы функций (*args, **kwargs), лямбда-выражения (lambda);
  • объекты и классы, инициализация;
  • основные встроенные модули (functools, math, string, sys, os, collections, time);
  • генераторы и итераторы (yield, iter);
  • работа с разными файлами (csv, изображения, текст);
  • исключения и ошибки (exceptions);
  • списковые включения (list comprehension);
  • работа с сетью (requests, BeautifulSoup).

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

Потом стоит переходить к серьезным трудам (типа М. Лутца), ознакомлению с популярными фреймворками и библиотеками (Django, flask, pandas).

Наследование класса в Python

Создавая новые классы не обязательно их создавать с нуля. Новый класс может наследовать свои атрибуты (переменные) и методы (функции принадлежащие классам) от ранее определенного исходного класса ( суперкласса ). Также исходный класс называют родителем, а новый класс — потомком или подклассом. В класс-потомок можно добавлять собственные атрибуты и методы. Напишем новый класс , который будет создан на базе класса :

class Car():
    «»»Описание автомобиля»»»
    def __init__(self, brand, model, years):
        «»»Инициализирует атрибуты brand и model»»»
        self.brand = brand
        self.model = model
        self.years = years
        self.mileage = 0

    def get_full_name(self):
        «»»Автомобиль»»»
        name = f»Автомобиль {self.brand} {self.model} {self.years}»
        return name.title()

    def read_mileage(self):
        «»»Пробег автомобиля»»»
        print(f»Пробег автомобиля {self.mileage} км.»)

    def update_mileage(self, new_mileage):
        «»»Устанавливает новое значение пробега»»»
        self.mileage = new_mileage
    
    def add_mileage(self, km):
        «»»Добавляет пробег»»»
        self.mileage += km

class ElectricCar(Car):
    «»»Описывает электромобиль»»»
    def __init__(self, brand, model, years):
        «»»Инициализирует атрибуты класса родителя»»»
        super().__init__(brand, model, years)
        # атрибут класса-потомка
        self.battery_size = 100

    def battery_power(self):
        «»»Выводит мощность аккумулятора авто»»»
        print(«Мощность аккумулятора {self.battery_size} кВт⋅ч»)

Мы создали класс на базе класса. Имя класса-родителя в этом случае ставится в круглые скобки( class ElectricCar(Car) ). Метод __init__  в классе потомка (подклассе) инициализирует атрибуты класса-родителя и создает экземпляр класса . Функция super() .- специальная функция, которая приказывает Python вызвать метод __init__() родительского класса Car, в результате чего экземпляр ElectricCar получает доступ ко всем атрибутам класса-родителя. Имя super как раз и происходит из-за того, что класс-родителя называют суперклассом, а класс-потомок — подклассом.          

Далее мы добавили новый атрибут и присвоили исходное значение 100. Этот атрибут будет присутствовать во всех экземплярах класса . Добавим новый метод battery_power(), который будет выводить информацию о мощности аккумулятора.         

Создадим экземпляр класса  и сохраним его в переменную tesla_1

tesla_1 = ElectricCar(‘tesla’, ‘model x’, 2021)
print(tesla_1.get_full_name())
tesla_1.battery_power()

При вызове двух методов мы получим:

Автомобиль Tesla Model X 2021
Мощность аккумулятора 100 кВт⋅ч

В новый класс  мы можем добавлять любое количество атрибутов и методов связанных и не связанных с классом-родителем .    

3.1. Переопределение методов класса-родителя

Методы, которые используются в родительском классе можно переопределить в классе-потомке (подклассе). Для этого в классе-потомке определяется метод с тем же именем, что и у класса-родителя. Python игнорирует метод родителя и переходит на метод, написанный в классе-потомке (подклассе). Переопределим метод def get_full_name() чтобы сразу выводилась мощность аккумуляторов. 

class ElectricCar(Car):
    «»»Описывает электромобиль»»»
    def __init__(self, brand, model, years):
        «»»Инициализирует атрибуты класса родителя»»»
        super().__init__(brand, model, years)
        # атрибут класса-потомка
        self.battery_size = 100

    def battery_power(self):
        «»»Выводит мощность аккумулятора авто»»»
        print(«Мощность аккумулятора {self.battery_size} кВт⋅ч»)

    def get_full_name(self):
        «»»Автомобиль»»»
        name = f»Автомобиль {self.brand} {self.model} {self.years} {self.battery_size}-кВт⋅ч »
         name.
 

В результате при запросе полного названия автомобиля Python проигнорирует метод def get_full_name() в классе-родителя и сразу перейдет к методу def get_full_name() написанный в классе .          

tesla_1 = ElectricCar(‘tesla’, ‘model x’, 2021)
print(tesla_1.get_full_name())

Автомобиль Tesla Model X 2021 100-Квт⋅Ч

Please enable JavaScript to view the comments powered by Disqus.

Парсим обязательные параметры с click

Простая функция позволяет нам создать CLI с местоположением, указанным пользователем. Это должно работать примерно так:

Как вы, возможно, догадались, местоположение — это аргумент, поскольку оно является обязательным параметром для нашего погодного CLI.

Как нам сделать это при помощи click? Всё довольно просто, мы используем декоратор под названием . Кто бы мог подумать?

Давайте возьмём наш предыдущий пример и слегка изменим его, добавив аргумент :

Если этот выглядит для вас странно, не волнуйтесь — это новый способ форматирования строк в Python 3.6+, который называется f-форматированием.

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

Примечание переводчика Имя аргумента, переданное click, должно совпадать с именем аргумента в объявлении функции.

В нашем случае значение аргумента командной строки будет передано функции в качестве аргумента . Логично, не так ли?

Также вы можете использовать тире в именах, например , которые click переведёт в snake case для имени аргумента в функции, например .

Реализация просто использует нашу функцию для получения погоды в указанном месте. И затем мы с помощью выводим полученную информацию.

Готово!

Python с абсолютного нуля. Учимся кодить без скучных книжек

От редакции

Не­дав­но мы про­води­ли опрос о том, какой курс по Python был бы инте­рес­нее читате­лям. Две пер­вые строч­ки с боль­шим отры­вом в нем заняли вари­анты «для хакера» и «Python с нуля». Узнав о таком положе­нии дел, мы немед­ленно заказа­ли статью о том, как начать прог­рамми­ровать на Python. Если она будет иметь успех, то может прев­ратить­ся в целую серию. Отли­чие нашего под­хода — в том, что мы объ­ясня­ем все живым язы­ком и даем нес­кучные при­меры. В общем, обу­чение в фир­менном сти­ле «Хакера»!

И, пос­коль­ку это экспе­римент, статья дос­тупна без плат­ной под­писки.

Ес­ли у тебя на ком­пе есть сов­ремен­ный дис­три­бутив Linux, то в него уже вхо­дит Python 3, а писать пер­вые прог­раммы будет удоб­но в IDLE — прос­том редак­торе кода, который при­лага­ется к Python. В Ubuntu, что­бы уста­новить его, набери в кон­соли

В Windows при уста­нов­ке Python обя­затель­но отметь на пер­вом экра­не уста­нов­щика галоч­ку Add to Path, что­бы мож­но было запус­кать python3 из коман­дной стро­ки в любом удоб­ном мес­те.

За­пус­тив IDLE, зай­ди в Options → Configure IDLE, перей­ди на вклад­ку General и пос­тавь галоч­ку на пун­кте Open Edit Window, наж­ми ОK и переза­пус­ти IDLE. Теперь мож­но писать прог­раммы, сох­ранять их и запус­кать кла­вишей F5. Ну что, пог­нали?

Создадим скрипт Python

Шаг №1 — откройте текстовый редактор.

Если вы находитесь на удаленном сервере, откройте свой любимый текстовый редактор. Для этого введите команду:

Вы можете использовать любой текстовый редактор (vim, nano и т. д.). Но если вы хотите что-то более продвинутое, я настоятельно рекомендую Sublime Text 3.

Шаг №2 — скопируйте и вставьте код!

Скопируйте и вставьте весь код из Jupyter Notebook в текстовый редактор:

Нажмите кнопку 10-Quit в правом нижнем углу (или Esc+0 на клавиатуре).

Шаг № 4 — Снова откройте текстовый файл

Вернемся к редактированию файла, набрав команду:

Теперь код выглядит более похожим на Python с различной подсветкой:

Шаг № 5 — Добавьте Shebang!

Shebang — это строка кода, которую нужно поместить в самом начале скрипта. Его задача – сообщить ОС, что у вас есть исполняемый файл Python3.

Строка shebang для скриптов Python3 выглядит следующим образом:

Если честно, ваш скрипт будет работать и без него. Несмотря на это, я предпочитаю добавлять Shebang по нескольким причинам:

Дополнительно: шаг № 6 — сделать скрипты на Python исполняемыми

После добавления Shebang, снова сохраните файл и попробуйте запустить скрипт, введя команду:

В некоторых случаях (в зависимости от конфигурации используемого сервера) вы получите ошибку прав доступа:

В Python подобная ошибка прав доступа не возникает. Если вы не столкнулись с этой проблемой, просто перейдите к шагу № 7.

Если у вас возникла ошибка прав доступа, в командной строке введите этот код:

Затем введите свой пароль.

Шаг №7 — запустите скрипт на Python!

Запустите скрипт, введя команду:

Это означает, что ваш скрипт на Python запущен… Но вы не видите никакого результата на экране.

Шаг № 8 — почему я ничего не вижу?

В большинстве случаев, когда вы конвертируете проект Jupyter Notebook в скрипт Python, вы не увидите на экране ничего. Это потому, что последняя строка вашего кода была такой:

Вернитесь к своему скрипту и измените последнюю строку на эту:

Нажмите 10-Quit и Save.

Перезапустите скрипт, введя для этого команду:

Шаг № 9 — Вы создали скрипт на Python

Вы создали скрипт на Python, и он работает. Но вы все равно захотите использовать Jupyter Notebook. Так как он является идеальным инструментом для тестирования и настройки процессов. Поэтому:

Создание веб-скрейпера

Для того, чтобы искать и просматривать уязвимости на сайте CVE, потребуется веб-скрейпер. Он поможет нам собирать информацию об уязвимостях. Мы создаем скрейпер в Requests и BeautifulSoup. Вот что будет делать наш скрейпер:

1. искать уязвимости;

2. получать информацию об уязвимости по ее названию на CVE.

Теперь откроем папку и создадим в ней файл под названием . Затем пропишем его базовые настройки:

Поиск уязвимостей

Для поиска уязвимостей на CVE используется URL в следующем формате: . Такой формат позволяет извлекать список уязвимостей, соответствующих ключевому слову.

Например, через URL можно получить список всех уязвимостей, связанных с Python:

Для извлечения данных открываем инструменты разработчика () и исследуем DOM-элемент с нужным представлением. Для этого кликните правой кнопкой по любому месту на странице и выберите “исследовать элемент” () либо нажмите .

Если вы присмотритесь к DOM-структуре выше, то увидите, что результаты представлены в виде таблицы, а каждое значение указано в отдельной строке под таблицей. Такие данные можно запросто извлечь:

В коде выше мы:

1. отправляем запрос в с помощью Requests и получаем DOM-содержимое;

2. преобразуем DOM-содержимое в объекты . Это позволит нам выделять DOM-элементы с помощью CSS-селекторов, и других методов;

3. выделяем все под таблицей . Выделяем первый столбец строки в качестве названия, а в качестве описания берем второй. Затем извлекаем текст.

Просмотр информации об уязвимостях

Чтобы просмотреть информацию об уязвимости, нужно взять ее и передать по этому адресу: https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-ID.

Откройте инструменты разработчика и исследуйте DOM-структуру.

Такая структура чуть сложнее, поскольку в строках таблицы отсутствует ID или название класса. Поэтому нам нужно пройтись циклом по каждой строке и проверить, не является ли она подзаголовком. Если да, то следующий элемент берется в качестве содержимого-потомка. Каждый подзаголовок отображается в , а его содержимое — в .

Готово! Мы успешно создали веб-скрейпер с CVE. Теперь добавим в него две функции ( и ), которые будут искать уязвимости и получать информацию по ним через .

Запуск Python и python-скрипт на компьютере

Код, написанный на языке Python, может храниться в редакторе кода, IDE или файле. И он не будет работать, если не знать, как его правильно запускать.

В этом материале рассмотрим 7 способов запуска кода, написанного на Python. Они будут работать вне зависимости от операционной системы, среды Python или местоположения кода.

Где запускать Python-скрипты и как?

Python-код можно запустить одним из следующих способов:

  1. С помощью командной строки операционной системы (shell или терминал);
  2. С помощью конкретной версии Python или Anaconda;
  3. Использовать Crontab;
  4. Запустить код с помощью другого Python-скрипта;
  5. С помощью файлового менеджера;
  6. Использовать интерактивный режим Python;
  7. Использовать IDE или редактор кода.

Запуск Python-кода интерактивно

Для запуска интерактивной сессии нужно просто открыть терминал или командную строку и ввести python (или python3 в зависимости от версии). После нажатия Enter запустится интерактивный режим.

Вот как запустить интерактивный режим в разных ОС.

Интерактивный режим в Linux

Откройте терминал. Он должен выглядеть приблизительно вот так :

После нажатия Enter будет запущен интерактивный режим Python.

На устройствах с macOS все работает похожим образом. Изображение ниже демонстрирует интерактивный режим в этой ОС.

В Windows нужно открыть командную строку и ввести python . После нажатия Enter появится приблизительно следующее:

Запуск Python-скриптов в интерактивном режиме

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

Этот код должен выводить целые числа от 0 до 5. В данном случае вывод — все, что появилось после print(i) .

Для выхода из интерактивного режима нужно написать следующее:

И нажать Enter. Вы вернетесь в терминал, из которого и начинали.

Есть и другие способы остановки работы с интерактивным режимом Python. В Linux нужно нажать Ctrl + D, а в Windows — Ctrl + Z + Enter.

Стоит отметить, что при использовании этого режима Python-скрипты не сохраняются в локальный файл.

Как выполняются Python-скрипты?

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

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

Но и это еще не все.

Блок-схема выполнения кода интерпретатором

  • Шаг 1: скрипт или .py-файл компилируется, и из него генерируются бинарные данные. Готовый файл имеет расширение .pyc или .pyo.
  • Шаг 2: генерируется бинарный файл. Он читается интерпретатором для выполнения инструкций.

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

Иногда полезно изучать байткод

Если вы планируете стать опытным Python-программистом, то важно уметь понимать его для написания качественного кода

Это также пригодится для принятия решений в процессе

Можно обратить внимание на отдельные факторы и понять, почему определенные функции/структуры данных работают быстрее остальных

Как запускать Python-скрипты?

Для запуска Python-скрипта с помощью командной строки сначала нужно сохранить код в локальный файл.

Возьмем в качестве примера файл, который был сохранен как python_script.py. Сохранить его можно вот так:

  • Создать Python-скрипт из командной строки и сохранить его,
  • Создать Python-скрипт с помощью текстового редактора или IDE и сохранить его. Просто создайте файл, добавьте код и сохраните как &#171;python_script.py&#187;

Сохранить скрипт в текстовом редакторе достаточно легко. Процесс ничем не отличается от сохранения простого текстового файла.

Но если использовать командную строку, то здесь нужны дополнительные шаги. Во-первых, в самом терминале нужно перейти в директорию, где должен быть сохранен файл. Оказавшись в нужной папке, следует выполнить следующую команду (на linux):

После нажатия Enter откроется интерфейс командной строки, который выглядит приблизительно следующим образом:

Теперь можно писать код и с легкостью сохранять его прямо в командной строке.

Установка библиотек Python

Следующим шагом установите питоновские библиотеки praw и pandas. Запустите серийный файл python_libraries.sh.

Praw — это враппер для API Python reddit.

Pandas — для манипуляций с данными и их анализа.

bash python_libraries.sh

#!/bin/bashecho "installing praw library"pip3 install prawecho "installing pandas library"pip3 install pandas

Настройка службы Cron

Программная утилита Cron — это планировщик времени запуска служб в компьютерных ОС наподобие Unix. Пользователи, которые занимаются установкой и поддержкой программных окружений, пользуются Cron для планирования служб (команд или скриптов оболочки). Они запускают их периодически в определённое время, дни или другие интервалы. Это типичная автоматизация системной поддержки или администрирования, тем не менее природа общего назначения этого ПО делает его полезным для таких вещей, как скачивание файлов из интернета и загрузка почты через равные интервалы.

Чтобы полностью автоматизировать этот процесс, последним шагом нужно запустить службу Cron с равными интервалами.

Для моего проекта я буду запускать прогон своего скрипта каждый час на 15-ой минуте. Команда для Cron будет выглядеть так:

15 * * * * /usr/bin/python3 /home/ubuntu/AWS-Lightsail/learnpython_to_csv.py >> ~/cron.log 2>&1

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

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Люкс-хост
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: