Pygin — Python adapter

Место, где разработчики плагинов могут поделиться своим опытом.
Post Reply
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Pygin — Python adapter

Post by DrKnS »

Image

Не прошло и трёх лет, как у меня дошли руки набросать демо для Python.
Умеет добавлять пункт в меню плагинов и показывать сакральную фразу под панелями.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

Latest post of the previous page:

Smitis, текущая стадия разработки не предполагает наличия обратной совместимости. Вывод на экран переделан, helloworld, идущий в комплекте, должен работать.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

DrKnS wrote: Это такой встроенный хелловорлд.
help(__hello__) co ccылкой на исходники было бы любопытно.
DrKnS wrote: Я думал об этом, но кто этот высокоуровневый API потом будет документировать?
А так оно более-менее похоже на то, что на api.farmanager.com.
Так и не надо выпиливать низкоуровневый. Оставить как есть. Документацию можно в README.md засунуть. Там всего-то 5е колбэков в http://api.farmanager.com/ru/basicapi/index.html нужно. Примера будет достаточно.
DrKnS wrote: Написано же - динамический. Он не импортируется, а приходит в SetStartupInfoW.
https://github.com/trexinc/evil-program ... l/30/files
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

DrKnS wrote: Обновил архив в шапке.
Изменения преимущественно внутренние, из видимого наружу - теперь есть динамический модуль farapi, предоставляющий плагину функции Far.
Что-то там какие-то неизвестные функции:

Code: Select all

Available API:
 - GetUserScreen
 - SetUserScreen
 - __doc__
 - __loader__
 - __name__
 - __package__
 - __spec__
 - api_pointer
 - error
https://github.com/techtonik/discovery/ ... t__.py#L55
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

techie wrote: Там всего-то 5е колбэков
Вы не туда смотрите.
Ну и это как бы абстракция ради абстракции, особого смысла пока не вижу.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Лежит http://api.farmanager.com/ru/exported_f ... index.html однако и не грузиццо.

Абстракция не ради абстракции, а для программеров на Python. Основной же принцип языка в том, что код читается гораздо больше раз, чем пишется. Здесь тоже - сделать нормальный интерфейс для плагина, интуитивно понятный про чтении кода - большое дело. Мне легко, потому что я пытался на C плагины писать много лет назад, но посадить питоняшу без сакрального знания наваять плагин будет тяжеловато. Даже по образу и подобию.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

А как обращаться к полям https://api.farmanager.com/ru/structures/openinfo.html ? Там пустой dict в OpenW передаётся.

https://github.com/techtonik/discovery/ ... _init__.py
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

Пока никак.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Okay. Будем ждать. :bojan:
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

techie wrote: Лучше, если плагин объявит класс
Ок, пусть будет класс.
В шапке.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

pygin_140517_6b26d5f.7z - это клёвое имя, но pygin_170514_6b26d5f.7z лучше сортируется по имени.
clipboard.png
clipboard.png (7.58 KiB) Viewed 5051 times
Да, что-то мудрёно получается. Непонятно что в какой последовательности запускается. Может рановато пока убирать сишные заглушки?.. В общем надо чуток помедитировать.

FarPluginClass - это хорошо, но вот плохо, что в __init__ ему ничего не валится. Там farapi всякие и т.п. Идея высокоуровневого интерфейса в том, чтобы всю статическую информацию Far взял из свойств плагина, а остальное уже происходило во время и после инициализации.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

techie wrote: в __init__ ему ничего не валится
Помедитировал, теперь валится.
User avatar
DrKnS
Posts: 6114
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 12 times
Been thanked: 426 times

Python adapter

Post by DrKnS »

techie wrote: clipboard.png
Помедитировал ещё, теперь будут стандартные сообщения.
Far надо >= 4959.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Теперь две ошибки выдаётся для 04class. Первая, что `AttributeError: module '04class' has no attribute 'FarPluginClass'`, а вторая

Code: Select all

                              Error loading plugin
                 C:\Far Manager\Plugins\04class\__init__.py
               The data area passed to a system call is too small.
Вот вторая ошибка вообще непонятна. Ожидается что-нибудь типа такого.

Code: Select all

                              Error loading plugin
                                   Plugins\04class\__init__.py
                    Module '04class' doesn't define 'FarPluginClass'.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Code: Select all

FarPluginClass = HelloWorldPlugin

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

Code: Select all

class HelloWorldPlugin(object):
	Title = "Hello Python world"
(object) не нужон. Title в верхнем регистре в питоне не принято, но здесь это приеольно выглядит для отделения требований API Far от остального кода.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Code: Select all

╔═ Pygin: std::exception ═╗
║ bad cast                ║
╟─────────────────────────╢
║         { OK }          ║
╚═════════════════════════╝
Это если GetPluginInfoW не сделать.
User avatar
techie
Posts: 795
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 35 times
Been thanked: 6 times

Python adapter

Post by techie »

Code: Select all

import pygin
from pygin.farapi_types import *
...
	def GetPluginInfoW(self):
		info = PluginInfo()
Всё-таки лучше без лишних импортов. Это позволит легче тестить логику, которая на Far не завязана.

Code: Select all

import pygin
...
	def GetPluginInfoW(self):
		info = self.far.PluginInfo()
Post Reply

Return to “Разработка плагинов”