Lunatic Python

Здесь обсуждается всё, что касается макросов.
Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Tue 19 Jan, 2016 11:59

Данный модуль позволяет вызывать питон из луа и луа из питона. С точки зрения Far это даёт возможность пользоваться из макросов многочисленными библиотеками питона.

1. Установить Python 3.4 (поскольку 3.5 на XP не ставится).
2. Скопировать src\out\x86\python.dll в %FARPROFILE%\Macros\lib32 (и/или src\out\x64\python.dll в %FARPROFILE%\Macros\lib64)
3. Скопировать демо-макрос src\py-hash.lua в %FARPROFILE%\Macros\scripts

Оригинальная библиотека и документация - здесь.
Используемый форк этой библиотеки - здесь.
lunatic-python-20160122.7z
(107.24 KiB) Downloaded 37 times
Last edited by Shmuel on Thu 10 Aug, 2017 12:57, edited 2 times in total.

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Fri 22 Jan, 2016 20:59

Попробовал собрать майкрософтовскими средствами - всё заработало: и на x86, и на x64.
Обновлённая версия - в шапке.

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Tue 26 Jan, 2016 15:35

Доработал демо-макрос по подобию плагина "Hash calculator". Теперь этот макрос более полезен и эстетичен.

Вообще удивляет отсутствие интереса к данной библиотеке.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Lunatic Python

Post by Smitis » Tue 26 Jan, 2016 19:37

Shmuel wrote:Вообще удивляет отсутствие интереса к данной библиотеке.
С моей точки зрения, Питон весьма неудобный язык (как и moonscript) для написания программ. На компьютере как скриптовый язык он мне не нужен.
Но, как дополнительная библиотека для lua может сгодиться, для Питона много чего понаписали. Но у меня "мобильная" версия ФАРа, синхронизируемая на нескольких компьютерах, пихать в неё ещё кучу файлов не хочется, итак объёмы растут. Тут бы разобраться, что действительно для работы Питона нужно. Экперимент показывает, что для данного примера достаточно python34.dll и несколько модулей из Lib (как я понял, реально используемые модули Питон предварительно компилирует в файлы *.pyc и помещает в папки __pycache__).
К сожалению, когда Питону чего-либо не хватает, ФАР при вызове макроса улетает в неизвестном направлении не попрощавшись. Вот бы какую-нибудь диагностику в виде сообщений типа "Не могу загрузить модуль zzzz" без падения ФАРа, это реализуемо?
Разум когда-нибудь победит.

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Tue 26 Jan, 2016 20:15

Smitis wrote: С моей точки зрения, Питон весьма неудобный язык (как и moonscript) для написания программ.
С этим не соглашусь, но ... о вкусах не спорят.
Smitis wrote: К сожалению, когда Питону чего-либо не хватает, ФАР при вызове макроса улетает в неизвестном направлении не попрощавшись. Вот бы какую-нибудь диагностику в виде сообщений типа "Не могу загрузить модуль zzzz" без падения ФАРа, это реализуемо?
Думаю, что всё реализуемо при условии вложения в проект нужного количества человеко-часов. Другой вопрос, произойдёт ли это.

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Sat 30 Jan, 2016 18:20

Демо-макрос: добавим прогресс-бар и возможность прерывать процесс нажатием Esc.

Smitis
Posts: 1452
Joined: Fri 18 Mar, 2005 12:51
Location: Питер
Has thanked: 12 times
Been thanked: 23 times
Contact:

Lunatic Python

Post by Smitis » Mon 01 Feb, 2016 14:06

При запуска макроса с прогресс-баром, сначала показывается прогресс-бар, до конца не доходит и питон вылетает с выводом в консоль

Code: Select all

Traceback (most recent call last):
File "<string>", line 21, in CalcHash
TypeError: 'float' object cannot be interpreted as an integer
Предыдущий макрос работает нормально.

Win7 x64, FAR 4527 (и предыдущие) x86, Python 3.4.4 x86
Разум когда-нибудь победит.

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Mon 01 Feb, 2016 14:18

Да, было такое, но уже исправлено.

Что плохо - то, что макрос (если он уже запускался) не выдерживает перезагрузки макросов - запуск после перезагрузки приводит к вылету. Надеюсь разобраться с этим, но когда - не знаю.

tstr
Posts: 500
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 3 times
Been thanked: 5 times

Lunatic Python

Post by tstr » Thu 10 Aug, 2017 11:44

пару замечаний касательно портабельности:
1. для загрузки Lunatic Python расширения достаточно добавить python34.dll и python34.zip в %FARHOME%
2. если не хотим захламлять %FARHOME%, то можно добавить в %FARPROFILE%\Macros\modules\python\init.lua что-то типа временной уставновки переменной PATH и загрузки модуля из dll:
- в данном случае добавляются временно %FARPROFILE%\Macros\clib.AMD64, %FARPROFILE%\Macros\lib.AMD64 или %FARPROFILE%\Macros\clib.IA32, %FARPROFILE%\Macros\lib.IA32 в зависимости от битности ФАР. в первой живёт Lunatic Python (python.dll), во второй - python34.dll и python34.zip

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Thu 10 Aug, 2017 16:23

tstr, дней 10 назад изменилось значение по умолчанию package.cpath. Поэтому 32-битный python.dll можно класть в %FARPROFILE%\Macros\lib32, а 64-битный - в %FARPROFILE%\Macros\lib64. Первый пост темы отредактирован с учётом этого изменения.

tstr
Posts: 500
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 3 times
Been thanked: 5 times

Lunatic Python

Post by tstr » Thu 10 Aug, 2017 17:38

Shmuel, я для себя ранее отметил указанные Вами изменения, но на подготовку локальной конфигурации как это нужно мне как пользователю (которая делалась ранее в _macroinit.lua , а затем перекочевала в luafar_init.lua, что исправило загрузку библиотек, используемых lfsearch и упростило схему) — кроме насильственного создания двух пустых папок, не повлияло. для пользователя - терпимо; для программиста, для определённости - хорошо. я указывал на ньюанс возможности перехвата загрузки модуля для подготовки окружения…

я понимаю насч. изначальной идеи совместимости с ХР а следовательно переносимости, но в свете pygin и возможностью настроек его загрузки с помощью python36._pth и pyvenv.cfg - может подправить Lunatic Python на использование “обёрточной” python3.dll ?

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Thu 10 Aug, 2017 17:53

tstr wrote:
Thu 10 Aug, 2017 17:38
может подправить Lunatic Python на использование “обёрточной” python3.dll ?
А эта обёрточная где-то есть готовая? Не хотелось бы ещё один проект заводить.
Поскольку сам я с XP уже съехал (заставили на работе, а так мне было с ней очень хорошо), то лично я уже не озабочен совместимостью с XP. Может быть просто пересобрать библиотеку с Python 3.6 ?

tstr
Posts: 500
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 3 times
Been thanked: 5 times

Lunatic Python

Post by tstr » Thu 10 Aug, 2017 18:36

интерфейс python3.dll - "стабильное" (stable ABI) подмножество интерфейса python36.dll , его хватает в большинстве кейсов использования подобного нашим. прелесть в том, что теоретически должно работать без пересборки на всей современной 3-й ветке.

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

Lunatic Python

Post by DrKnS » Thu 10 Aug, 2017 20:56

tstr wrote:
Thu 10 Aug, 2017 17:38
в свете pygin и возможностью настроек его загрузки с помощью python36._pth и pyvenv.cfg
А можно узнать подробности? И спасибо за информацию о python3.dll.

Shmuel
Posts: 5154
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 14 times
Been thanked: 144 times

Lunatic Python

Post by Shmuel » Thu 10 Aug, 2017 21:37

tstr wrote:
Thu 10 Aug, 2017 18:36
"стабильное" (stable ABI) подмножество интерфейса python36.dll , его хватает в большинстве кейсов использования подобного нашим
Но не хватает для библиотеки Lunatic Python (в том виде как она есть у нас сейчас). Например, используемая библиотекой функция PyUnicode_AsUTF8AndSize становится недоступной. (Всё это можно, наверное, решить, но я не уверен, что буду это делать).

tstr
Posts: 500
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 3 times
Been thanked: 5 times

Lunatic Python

Post by tstr » Thu 10 Aug, 2017 22:37

DrKnS wrote:
Thu 10 Aug, 2017 20:56
tstr wrote:
Thu 10 Aug, 2017 17:38
но в свете pygin и возможностью настроек его загрузки с помощью python36._pth и pyvenv.cfg
А можно узнать подробности?
пожалуйста, рад хоть чем-то помочь.

подробностей особенных нет, просто наблюдения из попыток применить зоопарк сборок к pygin и Lunatic:
1. понятно что система грузит гвоздями прилинкованный python36.dll доступный через PATH - он в свою очередь смотрит присутствие файлов pyvenv.cfg в папке на уровень и на два выше от загружающего процесса, и берёт из него настройку типа home = C:\CPython-v3.6.1150.0-AMD64 — базовую директорию рантайма (при отсутствии pyvenv.cfg будут взяты настройки из реестра).
2. по ._pth наиболее значимая часть доки: To completely override sys.path, create a ._pth file with the same name as the DLL (python36._pth) or the executable (python._pth) and specify one line for each path to add to sys.path. The file based on the DLL name overrides the one based on the executable, which allows paths to be restricted for any program loading the runtime if desired.
When the file exists, all registry and environment variables are ignored, isolated mode is enabled, and site is not imported unless one line in the file specifies import site. Blank paths and lines starting with # are ignored. Each path may be absolute or relative to the location of the file. Import statements other than to site are not permitted, and arbitrary code cannot be specified.

что нам это даёт: имея несколько версий рантайма можем без реестра и PATH что переключаться на нужную, что выбирать портабельную (или embedded) для каждой битности ФАР свою.
и маленьким бонусом - использовать для ФАР разной битности общие папки/окружения (начиная с общего python36.zip), благо что теперь лодером грузятся разные бинарники (например _yaml.cp36-win_amd64.pyd и _yaml.cp36-win32.pyd).
ну а о удобстве установки/обновления плагинов с их зависимостями в подпапки плагинов в виде микро-окружений прямо pip-ом с pypi и гитхаба и говорить нечего.

Post Reply

Return to “Обсуждение макросов”