Как создать файл с расширением py
Перейти к содержимому

Как создать файл с расширением py

  • автор:

Разработка расширений на Python¶

Для разработки расширений можно использовать язык программирования Python. По сравнению с классическими расширениями, написанными на C++, их легче разрабатывать, понимать, поддерживать и распространять в силу динамической природы самого Python.

Расширения на Python перечисляются в Менеджере модулей QGIS наравне с расширениями на C++. Поиск расширений выполняется в следующих каталогах:

  • UNIX/Mac: ~/.qgis/python/plugins и (qgis_prefix)/share/qgis/python/plugins
  • Windows: ~/.qgis/python/plugins и (qgis_prefix)/python/plugins

В Windows домашний каталог (обозначенный выше как ~ ) обычно выглядит как C:\Documents and Settings\(user) . Вложенные каталоги в этих папках рассматриваются как пакеты Python, которые можно загружать в QGIS как расширения.

  1. Идея: Прежде всего нужна идея для нового расширения QGIS. Зачем это нужно? Какую задачу необходимо решить? Может, есть готовое расширения для решения этой задачи?
  2. Создание файлов: Подробнее этот шаг описан ниже. Точка входа ( __init.py__ ). Тело расширения ( plugin.py ). Форма QT-Designer ( form.ui ), со своим resources.qrc .
  3. Реализация: Пишем код в plugin.py
  4. Тестирование: Закройте и снова откройте QGIS, загрузите своё расширение. Проверьте, что всё работает как надо.
  5. Публикация: опубликуйте своё расширение в репозитории QGIS или настройте свой собственный репозиторий в качестве “арсенала” личного “ГИС вооружения”

Разработка расширения¶

С момента введения поддержки Python в QGIS появилось множество расширений — на странице Plugin Repositories можно найти некоторые из них. Исходный код этих расширений можно использовать, чтобы узнать больше о программировании с PyQGIS, а также для того, чтобы удостовериться, что разработка не дублируется. Готовы к созданию расширения, но отсутствует идея? На странице Python Plugin Ideas собрано много идей и пожеланий!

Создание необходимых файлов¶

Ниже показано содержимое каталога нашего демонстрационного расширения:

PYTHON_PLUGINS_PATH/ testplug/ __init__.py plugin.py metadata.txt resources.qrc resources.py form.ui form.py

Для чего используются файлы:

  • __init__.py = Точка входа расширения. Содержит общую информацию, версию расширения, его название и основной класс.
  • plugin.py = Основной код расширения. Содержит информацию обо всех действиях, доступных в расширении, а также основной код.
  • resources.qrc = XML-документ, созданный QT-Designer. Здесь хранятся относительные пути к ресурсам форм.
  • resources.py = Понятная Python версия вышеописанного файла.
  • form.ui = Интерфейс пользователя (GUI), созданный в QT-Designer.
  • form.py = Конвертированная в код Python версия вышеописанного файла.
  • metadata.txt = требуется в QGIS >= 1.8.0. Содержит общую информацию, версию расширения, его название и другие метаданые, используемые новым репозиторием расширений. Метаданным в metadata.txt отдается предпочтение перед методами из файла __init__.py . Если текстовый файл присутствует, именно он будет использоваться для получения этой информации. Начиная с QGIS 2.0 метаданные из __init__.py больше не будут использоваться и файл metadata.txt станет обязательным.

Здесь и вот здесь можно найти два способа автоматической генерации базовых файлов (скелета) типового Python расширения для QGIS. Кроме того, существует модуль Plugin Builder , который создает шаблон модуля прямо из QGIS и не требует соединения с Интернет. Это упростит работу и поможет быстрее начать разработку типового расширения.

Написание кода¶

__init__.py¶

Прежде всего, Менеджер модулей должен получить основные сведения о расширении, такие как его название, описание и т.д. Файл __init__.py именно то место, где должна быть эта информация:

def name(): return "My testing plugin" def description(): return "This plugin has no real use." def version(): return "Version 0.1" def qgisMinimumVersion(): return "1.0" def authorName(): return "Developer" def classFactory(iface): # загружаем класс TestPlugin из файла testplugin.py from testplugin import TestPlugin return TestPlugin(iface) 

В QGIS 1.9.90 модули могут быть помещены не только в меню Модули , но и в меню Растр , Вектор , База данных и Web . Поэтому было введено новое поле метаданных “category”. Это поле используется в качестве подсказки для пользователей и сообщает где (в каком меню) искать модуль. Допустимыми значениями для параметра “category” являются Vector, Raster, Database, Web и Layers. Например, если модуль должен быть доступен из меню Растр , добавьте в __init__.py следующие строки:

def category(): return "Raster" 

metadata.txt¶

Для QGIS >= 1.8 необходимо создать файл metadata.txt (см. также) Пример :file: ` metadata.txt’:

; the next section is mandatory [general] name=HelloWorld qgisMinimumVersion=1.8 description=This is a plugin for greeting the (going multiline) world category=Raster version=version 1.2 ; end of mandatory metadata ; start of optional metadata changelog=this is a very very very very very very long multiline changelog ; tags are in comma separated value format, spaces are allowed tags=wkt,raster,hello world ; these metadata can be empty ; in a future version of the web application it will ; be probably possible to create a project on redmine ; if they are not filled homepage=http://www.itopen.it tracker=http://bugs.itopen.it repository=http://www.itopen.it/repo icon=icon.png ; experimental flag experimental=True ; deprecated flag (applies to the whole plugin and not only to the uploaded version) deprecated=False

plugin.py¶

Стоит сказать несколько слов о функции classFactory() , которая вызывается когда расширение загружается в QGIS. Она получает ссылку на экземпляр класса QgisInterface и должна вернуть экземпляр класса вашего расширения — в нашем случае этот класс называется«TestPlugin«. Ниже показано он должен выглядеть (например, testplugin.py ):

from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * # загружаем ресурсы Qt из файла resouces.py import resources class TestPlugin: def __init__(self, iface): # сохраняем ссылку на интерфейс QGIS self.iface = iface def initGui(self): # создаем действия для запуска расширения или его настройки self.action = QAction(QIcon(":/plugins/testplug/icon.png"), "Test plugin", self.iface.mainWindow()) self.action.setWhatsThis("Configuration for test plugin") self.action.setStatusTip("This is status tip") QObject.connect(self.action, SIGNAL("triggered()"), self.run) # добавляем кнопку на панель и пункт в меню self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("&Test plugins", self.action) # подключаемся к сигналу renderComplete, который посылается по завершению отрисовки карты QObject.connect(self.iface.mapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) def unload(self): # удаляем пункт меню и кнопку на панели self.iface.removePluginMenu("&Test plugins",self.action) self.iface.removeToolBarIcon(self.action) # отключаемся от сигнала карты QObject.disconnect(self.iface.MapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) def run(self): # создаем и показываем диалог настройки или выполняем что-то еще print "TestPlugin: run called!" def renderTest(self, painter): # рисуем на карте, используя painter print "TestPlugin: renderTest called!" 

Если используется QGIS 1.9.90 или старше и необходимо разместить модуль в одном из новых меню ( Растр , Вектор , База данных или Web ), нужно модифицировать код функций initGui() и unload() . Так как эти новые пункты меню доступны только в QGIS 1.9.90, прежде всего необходимо проверить, что используемая версия QGIS имеет все необходимые функции. Если новые пункты меню доступны, мы можем разместить модуль в нужном месте, в противном случае будем использовать меню Модули как и раньше. Вот пример для меню Растр :

def initGui(self): # создаем действия для запуска расширения или его настройки self.action = QAction(QIcon(":/plugins/testplug/icon.png"), "Test plugin", self.iface.mainWindow()) self.action.setWhatsThis("Configuration for test plugin") self.action.setStatusTip("This is status tip") QObject.connect(self.action, SIGNAL("triggered()"), self.run) # проверяем, доступно ли меню Растр if hasattr(self.iface, "addPluginToRasterMenu"): # меню Растр и одноименная панель доступны self.iface.addRasterToolBarIcon(self.action) self.iface.addPluginToRasterMenu("&Test plugins", self.action) else: # меню Растр отсутствует, размещаем модуль в меню Модули, как и раньше self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("&Test plugins", self.action) # одключаемся к сигналу renderComplete, который посылается по завершению отрисовки карты QObject.connect(self.iface.mapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) def unload(self): # проверям доступно ли меню Растр и удаляем наши кнопки из соответствующего # меню и панели if hasattr(self.iface, "addPluginToRasterMenu"): self.iface.removePluginRasterMenu("&Test plugins",self.action) self.iface.removeRasterToolBarIcon(self.action) else: self.iface.removePluginMenu("&Test plugins",self.action) self.iface.removeToolBarIcon(self.action) # отключаемся от сигнала карты QObject.disconnect(self.iface.MapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) 

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

В расширении обязательно должны присутствовать функции initGui() и unload() . Эти функции вызываются когда расширение загружается и выгружается.

Файл ресурсов¶

Как видно в примере выше, в initGui() мы использовали иконку из файла ресурсов (в нашем случае он называется resources.qrc ):

  icon.png  

Хорошим тоном считается использование префикса, это позволит избежать конфликтов с другими расширениями или с частями QGIS. Если префикс не задан, можно получить не те ресурсы, которые нужны. Теперь сгенерируем файл ресурсов на Python. Это делается командой pyrcc4:

pyrcc4 -o resources.py resources.qrc

Вот и все. ничего сложного 🙂 Если всё сделано правильно, то расширение должно отобразиться в Менеджере модулей и загружаться в QGIS без ошибок. После его загрузки на панели появится кнопка, а в меню — новый пункт, нажатие на которые приведет к выводу сообщения на терминал.

При работе над реальным расширением удобно вести разработку в другом (рабочем) каталоге и создать makefile, который будет генерировать файлы интерфейса и ресурсов, а также выполнять копирование расширения в каталог QGIS.

Документация¶

Этот способ создания документации требует наличия Qgis версии 1.5.

Документацию к расширению можно готовить в виде файлов HTML. Модуль qgis.utils предоставляет функцию showPluginHelp() , которая откроет файл справки в браузере, точно так же как другие файлы справки QGIS.

Функция showPluginHelp`() ищет файлы справки в том же каталоге, где находится вызвавший её модуль. Она по очереди будет искать файлы index-ll_cc.html , index-ll.html , index-en.html , index-en_us.html и index.html , и отобразит первый найденный. Здесь ll_cc — язык интерфейса QGIS. Это позволяет включать в состав расширения документацию на разных языках.

Кроме того, функция showPluginHelp() может принимать параметр packageName, идентифицирующий расширение, справку которого нужно отобразить; filename, который используется для переопределения имени файла с документацией; и section, для передачи имени якоря (закладки) в документе, на который браузер должен перейти.

Фрагменты кода¶

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

Как вызвать метод по нажатию комбинации клавиш¶

Добавьте в initGui() :

self.keyAction = QAction("Test Plugin", self.iface.mainWindow()) self.iface.registerMainWindowAction(self.keyAction, "F7") # action1 is triggered by the F7 key self.iface.addPluginToMenu("&Test plugins", self.keyAction) QObject.connect(self.keyAction, SIGNAL("triggered()"),self.keyActionF7) 
self.iface.unregisterMainWindowAction(self.keyAction) 

Метод, вызываемый по нажатию F7:

def keyActionF7(self): QMessageBox.information(self.iface.mainWindow(),"Ok", "You pressed F7") 

Как управлять видимостью слоя (временное решение)¶

Примечание: в QGIS 1.5 появился класс QgsLegendInterface , позволяющий управлять списком слоёв легенды.

Так как в настоящее время методы прямого доступа к слоям легенды отсутствуют, в качестве временно решения для управления видимостью слоёв можно использовать решение на основе изменения прозрачности слоя:

def toggleLayer(self, lyrNr): lyr = self.iface.mapCanvas().layer(lyrNr) if lyr: cTran = lyr.getTransparency() lyr.setTransparency(0 if cTran > 100 else 255) self.iface.mapCanvas().refresh() 

Метод принимает номер слоя в качестве параметры (0 соответствует самому верхнему) и вызывается так:

self.toggleLayer(3) 

Как получить доступ к таблице атрибутов выделенных объектов¶

def changeValue(self, value): layer = self.iface.activeLayer() if(layer): nF = layer.selectedFeatureCount() if (nF > 0): layer.startEditing() ob = layer.selectedFeaturesIds() b = QVariant(value) if (nF > 1): for i in ob: layer.changeAttributeValue(int(i),1,b) # 1 соответствует второй колонке else: layer.changeAttributeValue(int(ob[0]),1,b) # 1 соответствует второй колонке layer.commitChanges() else: QMessageBox.critical(self.iface.mainWindow(),"Error", "Please select at least one feature from current layer") else: QMessageBox.critical(self.iface.mainWindow(),"Error","Please select a layer")

Метод принимает один параметр (новое значения атрибута выделенного объекта(ов)) и вызывается как:

self.changeValue(50) 

Как выполнять отладку при помощи PDB¶

Сначала добавьте следующий код в место, которое будет отлаживаться:

# для отладки используем pdb import pdb # устанавливаем точку останова pyqtRemoveInputHook() pdb.set_trace() 

Затем запускаем QGIS из командной строки.

$ ./Qgis

$ /Applications/Qgis.app/Contents/MacOS/Qgis

Когда приложение достигнет точки останова, консоль станет доступной и можно будет вводить команды!

Тестирование¶

Публикация расширения¶

Если после создания расширения вы решите, что оно может быть полезно и другим пользователям — не бойтесь загрузить его в репозиторий QGIS plugin repository. На этой же странице можно найти инструкции по подготовке пакета, следование которым избавит от проблем с установкой расширения через Установщик модулей. В случае, когда нужно настроить собственный репозиторий, создайте простой XML документ, описывающий все расширения и их метаданные. Пример файла можно найти на странице Python plugin repositories.

Примечание: настройка IDE в Windows¶

При использовании Linux разработка расширений не требует дополнительных настроек. Но в при использовании Windows необходимо убедиться, что и QGIS, и интерпретатор используют одни и те же переменные окружения и библиотеки. Наиболее простой и быстрый способ сделать это — модифицировать командный файл для запуска QGIS.

Если используется установщик OSGeo4W, командный файл можно найти в каталоге bin папки, куда выполнена установка OSGeo4W. Ищите что-то похожее на C:\OSGeo4W\bin\qgis-unstable.bat .

Далее будет описана настройка Pyscripter IDE. Настройка других сред разработки может несколько отличаться:

  • Сделайте копию qgis-unstable.bat и переименуйте её в pyscripter.bat.
  • Откройте это файл в редакторе. Удалите последнюю строку, которая отвечает за запуск QGIS.
  • Добавьте строку для запуска pyscripter с параметром, указывающим на используемую версию Python. QGIS 1.5 использует Python 2.5.
  • Добавьте еще один аргумент, указывающий на каталог, где pyscripter должен искать библиотеки Python, используемые qgis. Обычно это каталог bin папки, куда установлен OSGeo4W:

@echo off SET OSGEO4W_ROOT=C:\OSGeo4W call "%OSGEO4W_ROOT%"\bin\o4w_env.bat call "%OSGEO4W_ROOT%"\bin\gdal16.bat @echo off path %PATH%;%GISBASE%\bin start C:\pyscripter\pyscripter.exe --python25 --pythondllpath=C:\OSGeo4W\bin

Теперь при запуске этого командного файла установятся необходимые переменные окружения и будет запущен pyscripter.

Как сделать из Python-скрипта исполняемый файл

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

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

В этой статье я покажу вам два простых метода конвертации файла Python в исполняемый файл с помощью PyInstaller и auto-py-to-exe. Это две популярные библиотеки Python, которые позволяют создавать автономные исполняемые файлы из скриптов Python. Для работы вам понадобится Python 3.6 или выше.

Способ 1: С помощью библиотеки PyInstaller:

PyInstaller — это библиотека Python, которая может анализировать ваш код и компоновать его с необходимыми модулями и библиотеками в один исполняемый файл. Она поддерживает множество платформ, включая Windows, Linux и Mac OS X. PyInstaller также может обрабатывать сложные случаи, такие как импорт файлов данных, скрытый импорт, приложения с графическим интерфейсом и т.д.

Чтобы использовать PyInstaller, вам нужно сначала установить его с помощью pip:

pip install pyinstaller

Затем вам нужно написать свой скрипт Python и сохранить его с расширением .py. В этом примере я буду использовать простой сценарий, который печатает «Hello World» и сохраняет его под именем hello.py:

print("Hello World")

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

pyinstaller hello.py

В результате вы создадите папку dist, содержащая исполняемый файл hello.exe. Вы можете дважды щелкнуть на этом файле, чтобы запустить его или поделиться им с другими.

Если вы хотите создать однофайловый исполняемый файл, не требующий дополнительных файлов или папок, вы можете использовать ключ —onefile:

pyinstaller --onefile hello.py

В папке dist будет создан один файл hello.exe, содержащий все необходимые коды и ресурсы.

Если вы хотите скрыть окно консоли при запуске исполняемого файла, вы можете использовать опцию —noconsole:

pyinstaller --noconsole --onefile hello.py

Будет создан исполняемый файл, работающий в фоновом режиме.

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

Способ 2: С помощью auto-py-to-exe:

auto-py-to-exe — это еще одна библиотека Python, которая может конвертировать скрипты Python в исполняемые файлы. Она основана на PyInstaller, но имеет графический интерфейс для пользователя (GUI), что делает ее более простой в работе. Вы можете просто выбрать свой скрипт, подобрать параметры и нажать кнопку, чтобы сгенерировать исполняемый файл.

Чтобы использовать auto-py-to-exe, вам нужно сначала установить его с помощью pip:

pip install auto-py-to-exe

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

auto-py-to-exe

Откроется окно, которое выглядит следующим образом:

Здесь вы можете выбрать свой скрипт, нажав на кнопку Browse рядом с Script Location. Вы также можете выбрать, хотите ли вы получить исполняемый файл в одном файле или в одной папке, выбрав One File или One Directory в разделе Output Options.

Вы также можете изменить другие настройки, такие как иконка, имя, окно консоли и т.д., перейдя на вкладку Advanced и изменив поля Additional Files или Window Based Options.

После того как вы закончите с настройками, нажмите на кнопку Convert .py to .exe в нижней части окна. Это запустит процесс преобразования и покажет результат на вкладке Консоль.

После завершения преобразования вы сможете найти исполняемый файл в папке вывода, указанной в разделе Output Options. Вы можете запустить его или поделиться им с другими пользователями.

28 августа начнется новый поток по языку программирования Python. На нем мы разберем: Библиотеки Python и решение конкретных задач DevOps; Правила эффективного и поддерживаемого кода; Принципы автоматизации: Docker, Gitlab, Prometheus, K8S и многое другое.

Python-сообщество

[RSS Feed]

  • Начало
  • » Python для новичков
  • » рубрика тупой вопрос от абсолютного нуля

#1 Апрель 30, 2022 13:13:32

sunflower Зарегистрирован: 2022-04-30 Сообщения: 7 Репутация: 0 Профиль Отправить e-mail

рубрика тупой вопрос от абсолютного нуля

Всем привет!
Вопрос:
1. в книге «Простой Python»
задание:
создать файл программы Py и запустить его.
Далее идет инструкция:
открыть текстовый редактор — открываю блокнот
ввести строку print (61) — печатаю в блокноте
сохранить файл с именем 61.py как простой текст — сохраняю с названием 61.py и расширением .txt
открыть окно терминала — открывала IDLE, и Командную строку, и окно python 3.10
запустить программу, введя строку $ python 61.py — сделала
Должна отобразиться строка
61
А у меня пишет, что неверный синтаксис(( как только я не писала, синтаксис не верен.
Но при этом, если я запускаю в IDLE или в окне терминала команды — у меня все работает.
Что я делаю не так??
2. В этой книге в важном идет такое замечание: символ $ — это обычное приглашение ввести команду вроде python в окно терминала. Мы будем использовать ее для примеров кода в этой книге, однако ваше приглашение может отличаться.
Как отличаться, как должно выглядеть? Какие еще команды приглашения есть?

Отредактировано sunflower (Апрель 30, 2022 19:18:49)

#2 Апрель 30, 2022 23:49:17

py.user.next От: Зарегистрирован: 2010-04-29 Сообщения: 9732 Репутация: 843 Профиль Отправить e-mail

рубрика тупой вопрос от абсолютного нуля

sunflower
сохранить файл с именем 61.py как простой текст — сохраняю с названием 61.py и расширением .txt

Расширения .txt не должно быть. Только расширение .py должно быть.

sunflower
открыть окно терминала — открывала IDLE, и Командную строку, и окно python 3.10

Надо открыть cmd.exe в той директории, где лежит скрипт 61.py .

Если он, например, лежит на диске D:\ и путь к нему D:\61.py , то действия такие:
Нажимаешь Win + R , там вводишь cmd.exe , нажимаешь Enter , дальше открывается консоль Windows, там вводишь

cd d:\

Дальше вводишь

Он выводит имя 61.py

И дальше вводишь там же

python 61.py

Он выполняет скрипт в консоли Windows. Окно консоли остаётся открытым.

А IDLE вообще не используй. Используй только cmd.exe .

sunflower
В этой книге в важном идет такое замечание: символ $ — это обычное приглашение ввести команду вроде python в окно терминала. Мы будем использовать ее для примеров кода в этой книге, однако ваше приглашение может отличаться.
Как отличаться, как должно выглядеть? Какие еще команды приглашения есть?

Тут речь идёт про Linux или другую UNIX-подобную операционную систему. Винда такой не является. Поэтому либо ставишь Linux себе, чтобы учиться программировать, либо адаптируешь всё под Windows, что будет сильно тормозить обучение. Соответственно, под виндой всё делается через cmd.exe и книжки к нему не относятся.

Отредактировано py.user.next (Апрель 30, 2022 23:51:43)

Не могу создать файл .py (Python)

Вот например я хочу создать файл .py . Создаю текстовый документ, называю test.py . А он создается как test.py.txt . Что делать? Помогите, в интернете решения не нашел.

Лучший ответ

если у тебя windows 10
1. открыть панель управления
2. найти в панели управления «параметры проводника»
3. убрать галочку с функции «скрывать расширения для зарегистрированных типов файлов

Артур ЧальянУченик (110) 1 год назад
С П А СИ Б О
Людмила ФельдшероваЗнаток (334) 1 год назад
Вы меня спасли!)
Остальные ответы
В параметрах вида настройте «видимость расширений»
Предводитель восстанияУченик (208) 4 года назад
Параметры вида.. Это где?

Если ты решил именно создать файл, так и создавай его в консольке:

copy con file.py

А лучше используй какую-нибудь IDE, все будет гораздо проще.

Almaz___☪Знаток (498) 1 год назад

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *