Область применения:Visual Studio
Visual Studio для Mac
Visual Studio Code
В процессе работы с проектами Python вам может потребоваться переключиться в командное окно для выполнения определенных скриптов или модулей, команд pip или запуска другого произвольного средства. Чтобы улучшить рабочий процесс, можно добавить пользовательские команды в подменю Python внутри контекстного меню проекта Python. Эти команды можно выполнять в окне консоли или в окне вывода Visual Studio. Кроме того, вы можете использовать регулярные выражения, чтобы сообщить Visual Studio, как анализировать ошибки и предупреждения из выходных данных команды.
По умолчанию это меню содержит только одну команду Выполнить PyLint:
Что такое команды и их параметры? — Уроки Python #1 | Космо
В этом же контекстном меню отображаются пользовательские команды. Пользовательские команды добавляются напрямую в файл проекта, после чего применяются к конкретному проекту. Вы также можете определить пользовательские команды в файле TARGETS, который легко импортировать в несколько файлов проектов.
Некоторые шаблоны проектов Python в Visual Studio уже добавляют собственные команды посредством своего файла TARGETS. Например, шаблоны «Веб-проект Bottle» и «Веб-проект Flask» добавляют две команды — Запуск сервера и Запустить сервер отладки. Шаблон «Веб-проект Django» добавляет как эти две команды, так и многие другие:
Каждая пользовательская команда может ссылаться на файл Python, модуль Python, встроенный код Python, произвольный исполняемый файл или команду pip. Вы можете указать, как и где выполняется команда.
При внесении изменений в файл проекта в текстовом редакторе нужно перезагрузить проект в Visual Studio, чтобы применить эти изменения. Например, нужно перезагрузить проект после добавления определений пользовательских команд, чтобы эти команды отображались в контекстном меню проекта.
Как вы знаете, Visual Studio предоставляет средства для редактирования файлов проекта напрямую. Щелкните правой кнопкой мыши файл проекта и выберите команду Выгрузить проект, затем снова щелкните правой кнопкой и выберите Изменить , чтобы открыть проект в редакторе Visual Studio. После этого внесите и сохраните изменения, еще раз щелкните проект правой кнопкой мыши и выберите Перезагрузить проект, после чего вам будет предложено подтвердить закрытие файла проекта в редакторе.
Python. Команды print() input()
Однако при разработке пользовательской команды эти действия могут утомлять пользователя. Чтобы повысить эффективность работы, загрузите проект в Visual Studio и параллельно откройте файл PYPROJ в отдельном редакторе (например, в другом экземпляре Visual Studio, Visual Studio Code, Блокноте и т. д.). Когда вы сохраняете изменения в редакторе и переключаетесь в Visual Studio, Visual Studio обнаруживает изменения и предлагает перезагрузить проект (Проект был изменен вне среды.). Выберите Перезагрузить, чтобы сразу же применить внесенные изменения за одно действие.
Пошаговое руководство. Добавление команды в файл проекта
Для ознакомления с пользовательскими командами в этом разделе рассматривается простой пример, в котором файл запуска проекта выполняется напрямую с помощью python.exe. (Такая команда фактически аналогична использованию команды Отладка>Запуск без отладки.)
- Создайте проект с именем Python-CustomCommands, используя шаблон Приложение Python. (Если вы еще не знакомы с этой процедурой, см. инструкции в статье Краткое руководство. Создание проекта Python из шаблона.)
- В Python_CustomCommands.py добавьте код print(«Hello custom commands») .
- Щелкните проект правой кнопкой мыши в обозревателе решений, выберите Python и обратите внимание, что в подменю отображается только команда Выполнить PyLint. В этом же подменю отображаются и ваши пользовательские команды.
- Откройте Python-CustomCommands.pyproj в отдельном текстовом редакторе, как описано во введении. Добавьте следующие строки в конец файла внутри прямо перед закрывающим и сохраните файл.
$(PythonCommands);
$(PythonCommands); Example_RunStartupFile
Чтобы команда отображалась перед командами, заданными в $(PythonCommands) , расположите их перед этим токеном.



Если вызвать команду, использующую свойства проекта, например ($StartupFile) , которая завершается с ошибкой из-за неопределенного токена, Visual Studio отключает эту команду до перезагрузки проекта. Однако внесение в проект изменений, определяющих это свойство, не обновляет состояние этих команд, поэтому в подобных ситуациях все равно нужно перезагрузить проект.
Структура целевого объекта команды
Общая форма элемента показана в следующем псевдокоде:
Чтобы сослаться на свойства проекта или переменные среды в значениях атрибутов, используйте имя в токене $() , например $(StartupFile) и $(MSBuildProjectDirectory) . Дополнительные сведения см. в разделе Свойства MSBuild.
Атрибуты Target
Атрибуты CreatePythonCommandItem
Все значения атрибутов указываются без учета регистра.
- executable. Запуск исполняемого файла с именем, указанным в Target, с добавлением значения в Arguments, как при вводе непосредственно в командной строке. Это значение должно содержать только имя программы без аргументов.
- script. Запуск python.exe с именем файла в Target, после которого идет значение в Arguments.
- module. Запуск python -m , после которого идет имя модуля в Target и значение в Arguments.
- code. Запуск встроенного кода, содержащегося в Target. Значение Arguments игнорируется.
- pip. Запуск pip с командой в Target, после которого идет Arguments; для ExecuteIn задано значение output, однако pip предполагает команду install и использует Target в качестве имени пакета.
- console. Запускает Target и аргументы, как при вводе непосредственно в командной строке (по умолчанию). Командное окно отображается при выполнении Target, а затем автоматически закрывается.
- consolepause. То же, что и console, но с ожиданием нажатия клавиши перед закрытием окна.
- output. Запускает Target и отображает результаты в окне вывода Visual Studio. Если TargetType имеет значение pip, Visual Studio использует Target в качестве имени пакета и добавляет Arguments.
- repl. Запускает Target в интерактивном окне Python; для заголовка окна используется необязательное отображаемое имя.
- none: аналогичен console.
Именованные группы записи для регулярных выражений
При анализе ошибки и предупреждений из выходных данных команды Visual Studio ожидает, что регулярные выражения в значениях ErrorRegex и WarningRegex используют следующие именованные группы:
- (?. ) . Текст ошибки.
- (?. ) . Код ошибки
- (?. ) . Имя файла, для которого возникла ошибка.
- (?. ) . Номер строки в файле, где произошла ошибка.
- (?. ) . Номер столбца в файле, где произошла ошибка.
Например, PyLint выводит предупреждения в следующем виде:
************* Module hello C: 1, 0: Missing module docstring (missing-docstring)
Чтобы разрешить Visual Studio извлечь правильную информацию из таких предупреждений и отобразить их в окне Список ошибок, значение WarningRegex для команды Выполнить PyLint имеет следующий вид:
^(?.+?)((?d+),(?d+)): warning (?.+?): (?.+?)$]]
(Обратите внимание, что msg_id в значении должно быть code , см. описание запроса 3680.)
Создание TARGETS-файлов с пользовательскими командами
Пользовательские команды, определенные в файле проекта, доступны только этому файлу. Чтобы использовать команды в нескольких файлах проектов, следует определить группу свойств и все ваши элементы в файле TARGETS. Затем этот файл можно импортировать в отдельные файлы проектов.
Файл TARGETS имеет следующий формат:
$(PythonCommands);
Чтобы загрузить файл TARGETS в проект, расположите элемент в любом месте внутри элемента . Например, если у вас есть файл с именем CustomCommands.targets во вложенной папке targets в проекте, используйте следующий код:
При каждом изменении файла TARGETS нужно перезагружать решение, содержащее этот проект, а не только сам проект.
Примеры команд
Выполнение PyLint (целевой объект модуля)
В файле Microsoft.PythonTools.targets отображается следующий код:
Запуск pip install с определенным пакетом (целевой объект pip)
Следующая команда запускает pip install my-package в окне вывода. Эту команду можно использовать при разработке пакета и тестировании его установки. Обратите внимание, что Target содержит имя пакета, а не команду install , которая предполагается при использовании ExecuteIn=»output» .
Отображение устаревших пакетов pip (целевой объект pip)
Запуск исполняемого файла с consolepause
Следующая команда просто запускает where для отображения файлов Python, начиная с папки проекта:
Выполнение команд запуска сервера и сервера отладки
Чтобы узнать, как определены команды Запуск сервера и Запустить сервер отладки для веб-проектов, см. Microsoft.PythonTools.Web.targets (GitHub).
Установка пакета для разработки
Из файла fxthomas/Example.pyproj.xml (GitHub), используемого с разрешениями.
Создание установщика Windows
Из файла fxthomas/Example.pyproj.xml (GitHub), используемого с разрешениями.
Создание пакета wheel
Из файла fxthomas/Example.pyproj.xml (GitHub), используемого с разрешениями.
Устранение неполадок
Сообщение: «Не удалось загрузить файл проекта»
Указывает на наличие синтаксических ошибок в файле проекта. Это сообщение содержит конкретную ошибку с номером строки и позицией символа.
Окно консоли закрывается сразу после выполнения команды
Используйте ExecuteIn=»consolepause» вместо ExecuteIn=»console» .
Команда не отображается в меню
Убедитесь, что команда включена в группу свойств , а имя в списке команд совпадает с именем, указанным в элементе .
Например, в следующих элементах имя Example в группе свойств не соответствует имени ExampleCommand в целевом объекте. Visual Studio не может найти команду с именем Example, поэтому команда не отображается. Используйте ExampleCommand в списке команд или измените имя целевого объекта на Example.
$(PythonCommands);Example
Сообщение: «Произошла ошибка при выполнении . Не удалось получить команду из проекта».
Указывает, что содержимое элементов или неправильно. Возможные причины:
- Обязательный атрибут Target пуст.
- Обязательный атрибут TargetType пуст или содержит неопознанное значение.
- Обязательный атрибут ExecuteIn пуст или содержит неопознанное значение.
- ErrorRegex или WarningRegex указан без задания ExecuteIn=»output» .
- В элементе присутствуют неопознанные атрибуты. Например, вы могли использовать Argumnets (с опечаткой) вместо Arguments .
Значения атрибутов могут быть пустыми, если вы ссылаетесь на свойство, которое не было определено. Например, если вы используете токен $(StartupFile) , но в проекте не задан файл запуска, этот токен разрешается в пустую строку. В таких случаях может потребоваться определить значение по умолчанию. Например, команды Запуск сервера и Запустить сервер отладки, определенные в шаблонах проектов Bottle, Flask и Django, по умолчанию используют manage.py, если вы иным образом не указали файл запуска сервера в свойствах проекта.
Visual Studio перестает отвечать и аварийно завершает работу при выполнении команды
Скорее всего, вы пытаетесь запустить команду консоли с ExecuteIn=»output» . В этом случае Visual Studio может аварийно завершить работу при попытке проанализировать выходные данные. Взамен рекомендуется использовать ExecuteIn=»console» . (См. описание запроса 3682.)
Исполняемая команда «не является внутренней или внешней командой, работающей программой или пакетным файлом»
При использовании TargetType=»executable» значение в Target должно содержать только имя программы без аргументов, например только python или python.exe. Переместите все аргументы в атрибут Arguments .
Источник: learn.microsoft.com
Пишем инструменты командной строки на Python с помощью Click
Python — невероятно гибкий язык программирования, который хорошо интегрируется с существующими программами. Немало Python-кода написано в виде скриптов и интерфейсов командной строки (CLI).
Инструменты и интерфейсы командной строки — эффективная вещь, так как они позволяют автоматизировать практически всё что угодно. Как следствие, эти интерфейсы с течением времени могут стать довольно сложными.
Обычно всё начинается с простого скрипта на Python, который что-то делает. Например, получает доступ к веб-API и выводит результат в консоль:
# print_user_agent.py import requests json = requests.get(‘http://httpbin.org/user-agent’).json() print(json[‘user-agent’])
Вы можете запустить этот скрипт с помощью команды python3 print_user_agent.py , и он выведет имя user-agent, использованного для вызова API.
Редактор-модератор сообщества по теме Python / Data Science / AI Tproger , Удалённо , От 50 000 ₽
Как и было сказано, довольно простой скрипт.
Но что делать, когда подобная программа растёт и становится всё более сложной?
Решением этого вопроса мы сегодня и займёмся. Вы узнаете об основах написания интерфейсов командной строки на Python и о том, как click позволяет упростить этот процесс.
Используя эти знания, мы шаг за шагом перейдём от простого скрипта к интерфейсу командной строки с аргументами, опциями и полезными инструкциями по использованию. Всё это мы сделаем с помощью библиотеки click.
К концу этой статьи вы будете знать:
- Почему click — лучшая альтернатива argparse и optparse;
- Как с его помощью создать простой CLI;
- Как добавить обязательные аргументы командной строки в ваши скрипты;
- Как парсить флаги и опции командной строки;
- Как сделать ваши консольные приложения более удобными, добавив справочный текст.
Вы увидите, как сделать всё это с минимальным количеством шаблонного кода.
Примечание переводчика Код в данной статье написан на Python 3.6, работоспособность на более ранних версиях не гарантируется.
Зачем вам писать скрипты и инструменты для командной строки на Python?
Код выше — всего лишь пример, не очень полезный в реальной жизни. На самом деле скрипты бывают куда более сложные. Возможно, вы имели опыт с ними и знаете, что они могут быть важной частью нашей повседневной работы: некоторые скрипты остаются на протяжении всего времени жизни проекта, для которого они были написаны. Некоторые начинают приносить пользу другим командам или проектам. У них даже может расширяться функционал.
В этих случаях важно сделать скрипты более гибкими и настраиваемыми с помощью параметров командной строки. Они позволяют указать имя сервера, учётные данные или любую другую информацию скрипту.
Здесь приходят на выручку такие модули, как optparse и argparse, которые делают нашу жизнь на порядок проще. Но прежде чем мы с ними познакомимся, давайте разберёмся с терминологией.
Основы интерфейса командной строки
Интерфейс командной строки (CLI) начинается с имени исполняемого файла. Вы вводите имя в консоль и получаете доступ к главной точке входа скрипта, такого как pip.
В зависимости от сложности CLI обычно есть определённые параметры, которые вы можете передавать скрипту:
- Аргумент, который является обязательным параметром. Если его не передать, то CLI вернёт ошибку. Например, в следующей команде click является аргументом: pip install click .
- Опция — необязательный параметр, который объединяет имя и значение, например —cache-dir ./my-cache . Вы говорите CLI, что значение ./my-cache должно использоваться как директория для кэша.
- Флаг, который включает или выключает определённый сценарий. Вероятно, самым частым является —help . Вы только указываете имя, а CLI самостоятельно интерпретирует значение.
С более сложными CLI, такими как pip или Heroku CLI, вы получаете доступ к набору функций, которые собраны под главной точкой входа. Они обычно называются командами или подкомандами.
Возможно, вы уже использовали CLI, когда устанавливали Python-библиотеку с помощью команды pip install . Команда install говорит CLI, что вы хотите использовать функцию установки пакета, и даёт вам доступ к параметрам, характерным для этой функции.
Пакеты для работы с командной строкой, доступные в стандартной библиотеке Python 3.x
Добавление команд и параметров в ваши скрипты может сделать их значительно лучше, но парсить командную строку не так просто, как может показаться. Однако вместо того, чтобы пытаться самостоятельно решить эту проблему, лучше воспользоваться одним из многих пакетов, которые сделали это за вас.
Два наиболее известных пакета для этого — optparse и argparse. Они являются частью стандартной библиотеки Python и добавлены туда по принципу «всё включено».
По большей части они делают одно и то же и работают схожим образом. Главное отличие заключается в том, что optparse не используется начиная с Python 3.2, и argparse считается стандартом для создания CLI в Python.
Вы можете узнать о них больше в документации Python, но, чтобы иметь представление, как выглядит скрипт с argparse, посмотрите на пример ниже:
import argparse parser = argparse.ArgumentParser(description=’Process some integers.’) parser.add_argument(‘integers’, metavar=’N’, type=int, nargs=’+’, help=’an integer for the accumulator’) parser.add_argument(‘—sum’, dest=’accumulate’, action=’store_const’, const=sum, default=max, help=’sum the integers (default: find the max)’) args = parser.parse_args() print(args.accumulate(args.integers))
click против argparse: лучшая альтернатива?
Вероятно, вы смотрите на этот код и думаете: «Что это всё значит?» И это является одной из проблем argparse: код с ним неинтуитивен и сложночитаем.
Поэтому вам может понравиться click.
Click решает ту же проблему, что и optparse и argparse, но немного иначе. Он использует декораторы, поэтому ваши команды должны быть функциями, которые можно обернуть этими декораторами.
С click легко создавать многофункциональный CLI с небольшим количеством кода. И этот код будет легко читаться, даже когда ваш CLI вырастет и станет более сложным.
Пишем простой CLI на Python с помощью click
Вдоволь поговорив о CLI и библиотеках, давайте взглянем на пример, чтобы понять, как написать простой CLI с click. Как и в первом примере, мы создаём простой CLI, который выводит результат в консоль. Это несложно:
Не пугайтесь последних двух строк: это то, как Python запускает функцию main при исполнении файла как скрипта.
$ python3 cli.py I’m a beautiful CLI ✨
Что в click здорово, так это то, что мы получаем некоторые дополнительные возможности просто так. Мы не реализовывали справочную функцию, однако вы можете добавить флаг —help и увидеть базовое сообщение:
$ python3 cli.py —help Usage: cli.py [OPTIONS] Options: —help Show this message and exit.
Более реалистичный пример CLI на Python с использованием click
Теперь, когда вы знаете, как click упрощает написание CLI, давайте взглянем на более реалистичный пример. Мы напишем программу, которая позволяет нам взаимодействовать с веб-API.
API, который мы дальше будем использовать, — OpenWeatherMap API. Он предоставляет информацию о текущей погоде, а также прогноз на пять дней для определённого местоположения. Мы начнём с тестового API, который возвращает текущую погоду для места.
Прежде чем мы начнём писать код, давайте познакомимся с API. Для этого можно использовать сервис HTTPie, включая онлайн-терминал.
Давайте посмотрим, что случится, когда мы обратимся к API с Лондоном в качестве местоположения:
$ http —body GET http://samples.openweathermap.org/data/2.5/weather q==London appid==b1b15e88fa797225412429c1c50c122a1 < «base»: «stations», «clouds»: < «all»: 90 >, «cod»: 200, «coord»: < «lat»: 51.51, «lon»: -0.13 >, «dt»: 1485789600, «id»: 2643743, «main»: < «humidity»: 81, «pressure»: 1012, «temp»: 280.32, «temp_max»: 281.15, «temp_min»: 279.15 >, «name»: «London», «sys»: < «country»: «GB», «id»: 5091, «message»: 0.0103, «sunrise»: 1485762037, «sunset»: 1485794875, «type»: 1 >, «visibility»: 10000, «weather»: [ < «description»: «light intensity drizzle», «icon»: «09d», «id»: 300, «main»: «Drizzle» >], «wind»: < «deg»: 80, «speed»: 4.1 >>
Если вы смущены наличием API-ключа в примере сверху, не переживайте, это тестовый API-ключ, предоставляемый сервисом.
Более важное наблюдение заключается в том, что мы отправляем два параметра (обозначаемые == при использовании HTTPie), чтобы узнать текущую погоду:
- q — место, в котором мы хотим узнать погоду;
- appid — наш API-ключ.
Это позволяет нам создать простую реализацию на Python с использованием библиотеки requests (опустим обработку ошибок и неудачных запросов для простоты):
import requests SAMPLE_API_KEY = ‘b1b15e88fa797225412429c1c50c122a1’ def current_weather(location, api_key=SAMPLE_API_KEY): url = ‘http://samples.openweathermap.org/data/2.5/weather’ query_params = < ‘q’: location, ‘appid’: api_key, >response = requests.get(url, params=query_params) return response.json()[‘weather’][0][‘description’]
Эта функция делает простой запрос к API, используя два параметра. В качестве обязательного аргумента она принимает location (местоположение), которое должно быть строкой. Также мы можем указать API-ключ, передавая параметр api_key при вызове функции. Это необязательно, так как по умолчанию используется тестовый ключ.
И вот мы видим текущую погоду в Python REPL:
>>> current_weather(‘London’) ‘light intensity drizzle’ # впрочем, ничего нового ?
Парсим обязательные параметры с click
Простая функция current_weather позволяет нам создать CLI с местоположением, указанным пользователем. Это должно работать примерно так:
$ python3 cli.py London The weather in London right now: light intensity drizzle.
Как вы, возможно, догадались, местоположение — это аргумент, поскольку оно является обязательным параметром для нашего погодного CLI.
Как нам сделать это при помощи click? Всё довольно просто, мы используем декоратор под названием argument . Кто бы мог подумать?
Давайте возьмём наш предыдущий пример и слегка изменим его, добавив аргумент location :
Если этот print выглядит для вас странно, не волнуйтесь — это новый способ форматирования строк в Python 3.6+, который называется f-форматированием.
Как вы видите, всё, что нам нужно сделать, это добавить дополнительный декоратор к нашей функции main и дать ему имя. Click использует имя в качестве имени аргумента, переданного обёрнутой функции.
Примечание переводчика Имя аргумента, переданное click, должно совпадать с именем аргумента в объявлении функции.
В нашем случае значение аргумента командной строки location будет передано функции main в качестве аргумента location . Логично, не так ли?
Также вы можете использовать тире в именах, например api-key , которые click переведёт в snake case для имени аргумента в функции, например main(api_key) .
Реализация main просто использует нашу функцию current_weather для получения погоды в указанном месте. И затем мы с помощью print выводим полученную информацию.
Парсим опциональные параметры с click
Как вы, возможно, догадались, тестовый API ограничивает нас в возможностях. Поэтому, прежде чем мы продолжим, зарегистрируйтесь и получите настоящий API-ключ.
Первое, что нам нужно изменить, — URL, откуда берутся данные о текущей погоде. Это можно сделать, изменив значение переменной url в функции current_weather на URL, указанный в документации OpenWeatherMap:
def current_weather(location, api_key=SAMPLE_API_KEY): url = ‘https://api.openweathermap.org/data/2.5/weather’ # дальше всё остаётся как было .
Это изменение приведёт к неработоспособности нашего CLI, так как указанный API-ключ не работает с реальным API. Поэтому давайте добавим новый параметр в наш CLI, который позволит нам указывать API-ключ. Но сначала мы должны решить, будет ли этот параметр аргументом или опцией. Мы сделаем его опцией, так как добавление параметра вроде —api-key делает его более явным и говорящим за себя.
Мы хотим, чтобы наша программа запускалась таким образом:
$ python3 cli.py —api-key London The weather in London right now: light intensity drizzle.
Проще простого. Посмотрим, как добавить опцию к нашей существующей команде:
Как было сказано ранее, click создаёт аргумент для передачи в функцию main из длинного варианта имени. В случае с опцией он убирает впередистоящие тире и переводит её в snake case. Таким образом, —api-key становится api_key .
Чтобы всё заработало, осталось лишь передать API-ключ в функцию current_weather .
Создаём Telegram-бота на Python с помощью pyTelegramBotAPI (telebot)
Сегодня будем учиться создавать ботов в Telegram с помощью Python.
Попробуем заставить бота присылать сводку погоды по нашему городу.
Нам потребуется:
- Компьютер или ноутбук (При должном усердии можно попробовать на телефоне).
- Python 3 (Мы будем работать на версии 3.10).
- Редактор кода (Я использую PyCharm).
- Соединение с интернетом.
У всех на слуху две библиотеки для разработки telegram-ботов, это:
— telebot (он же pyTelegramBotAPI),
— aiogram.