Pygin — Python adapter

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

Pygin — Python adapter

Post by DrKnS » Wed 30 Dec, 2015 17:52

Image

Не прошло и трёх лет, как у меня дошли руки набросать демо для Python.
Умеет добавлять пункт в меню плагинов и показывать сакральную фразу под панелями.

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Python adapter

Post by DrKnS » Thu 11 May, 2017 07:49

Latest post of the previous page:

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

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 11 May, 2017 10:57

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: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 11 May, 2017 11:23

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: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Python adapter

Post by DrKnS » Thu 11 May, 2017 12:06

techie wrote: Там всего-то 5е колбэков
Вы не туда смотрите.
Ну и это как бы абстракция ради абстракции, особого смысла пока не вижу.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 11 May, 2017 16:08

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

Абстракция не ради абстракции, а для программеров на Python. Основной же принцип языка в том, что код читается гораздо больше раз, чем пишется. Здесь тоже - сделать нормальный интерфейс для плагина, интуитивно понятный про чтении кода - большое дело. Мне легко, потому что я пытался на C плагины писать много лет назад, но посадить питоняшу без сакрального знания наваять плагин будет тяжеловато. Даже по образу и подобию.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Thu 11 May, 2017 17:00

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

https://github.com/techtonik/discovery/ ... _init__.py

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Python adapter

Post by DrKnS » Thu 11 May, 2017 21:34

Пока никак.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Fri 12 May, 2017 02:41

Okay. Будем ждать. :bojan:

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Python adapter

Post by DrKnS » Sun 14 May, 2017 01:03

techie wrote: Лучше, если плагин объявит класс
Ок, пусть будет класс.
В шапке.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Sun 14 May, 2017 10:09

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

FarPluginClass - это хорошо, но вот плохо, что в __init__ ему ничего не валится. Там farapi всякие и т.п. Идея высокоуровневого интерфейса в том, чтобы всю статическую информацию Far взял из свойств плагина, а остальное уже происходило во время и после инициализации.

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Python adapter

Post by DrKnS » Sun 14 May, 2017 14:07

techie wrote: в __init__ ему ничего не валится
Помедитировал, теперь валится.

User avatar
DrKnS
Posts: 4648
Joined: Thu 04 Aug, 2005 06:44
Location: Kyiv
Has thanked: 4 times
Been thanked: 125 times
Contact:

Python adapter

Post by DrKnS » Sun 14 May, 2017 20:24

techie wrote: clipboard.png
Помедитировал ещё, теперь будут стандартные сообщения.
Far надо >= 4959.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Mon 15 May, 2017 12:13

Теперь две ошибки выдаётся для 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: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Mon 15 May, 2017 12:31

Code: Select all

FarPluginClass = HelloWorldPlugin

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

Code: Select all

class HelloWorldPlugin(object):
	Title = "Hello Python world"
(object) не нужон. Title в верхнем регистре в питоне не принято, но здесь это приеольно выглядит для отделения требований API Far от остального кода.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Mon 15 May, 2017 12:42

Code: Select all

╔═ Pygin: std::exception ═╗
║ bad cast                ║
╟─────────────────────────╢
║         { OK }          ║
╚═════════════════════════╝
Это если GetPluginInfoW не сделать.

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Mon 15 May, 2017 13:18

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()

User avatar
techie
Posts: 761
Joined: Mon 03 Oct, 2005 22:42
Has thanked: 28 times
Been thanked: 2 times

Python adapter

Post by techie » Mon 15 May, 2017 13:25

Code: Select all

AttributeError: 'NoneType' object has no attribute 'PluginMenuItems'
Более понятно было бы что-нибудь типа.

Code: Select all

GetPluginInfoW did not return `PluginInfo' structure

Post Reply

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