Lunatic Python

Здесь обсуждается всё, что касается макросов.
tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

Lunatic Python

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

Latest post of the previous page:

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 и гитхаба и говорить нечего.

tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

Lunatic Python

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

Shmuel wrote:
Thu 10 Aug, 2017 21:37
Но не хватает для библиотеки Lunatic Python (в том виде как она есть у нас сейчас).
ясно, жаль. но я ожидал что всё будет не так просто… )

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Fri 11 Aug, 2017 03:41

tstr wrote:
Thu 10 Aug, 2017 22:40
я ожидал что всё будет не так просто… )
Посмотрел поглубже: если недостающие в "Limited API" пару функций можно было бы и заменить, то отсутствие доступа к полям структуры PyTypeObject делает задачу практически невыполнимой.

Можно, чтобы не терять совместимость с XP, просто собирать 2 версии библиотеки: одна для Python 3.4, другая - для Python 3.6.

tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

Lunatic Python

Post by tstr » Fri 11 Aug, 2017 05:04

да, на данный момент это оптимальный выход.

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Fri 11 Aug, 2017 23:34

Наконец-то разобрался, отчего демо-макрос не выдерживал перезагрузки макросов и вызывал падение при запусках после перезагрузки. Проблема - в библиотеке, и починить её будет не просто. Однако есть способ обойти эту проблему - не вызывать require "python" из функции action() макроса, а вызывать в начале макрофайла. Поправленный макрос приложен.
py-hash-20170812.7z
(1.71 KiB) Downloaded 14 times

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Thu 17 Aug, 2017 19:00

Начальный пост обновлён (вложение и инструкции).
Сама библиотека без изменений, но теперь включены бинарники для версий питона 3.4 и 3.6.
Скрипт также слегка обновлён.
Last edited by Shmuel on Fri 18 Aug, 2017 03:34, edited 1 time in total.

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Thu 17 Aug, 2017 21:04

Кстати, вопрос к знатокам:
Берём один из бинарников библиотеки - Dependency Walker показывает зависимости только от lua51.dll, python36.dll и kernel32.dll.
Но библиотека использует функции malloc, strcpy, strlen и т.д., которые вроде не экспортируются этими длл-ками.
Как же это работает?

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

Lunatic Python

Post by Smitis » Fri 18 Aug, 2017 15:56

Shmuel wrote:
Thu 17 Aug, 2017 21:04
Как же это работает?
Может, загружается динамически?

А что за папка loadall.dll присутствует в package.cpath?
Разум когда-нибудь победит.

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Fri 18 Aug, 2017 16:12

Smitis wrote:
Fri 18 Aug, 2017 15:56
Может, загружается динамически?
Вроде понял, что наоборот - линкуется статически в DLL. Мне раньше казалось, что для статической линковки нужны специальные приседания, а тут обычная комстрока cl похоже это делает по умолчанию.
Smitis wrote:
Fri 18 Aug, 2017 15:56
А что за папка loadall.dll присутствует в package.cpath?
Это не папка, это имя "библиотеки по умолчанию" (если ничего другого не найдено), которое можно конфигурировать в файле luaconf.h перед сборкой. Поскольку я переопределяю package.path и package.cpath в %FARPROFILE%\luafar_init.lua, то у меня этого нет.

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

Lunatic Python

Post by Smitis » Fri 18 Aug, 2017 21:34

Shmuel
Если переопределить package.cpath в luafar_init.lua к нему всё равно добавляется папка lib64 (lib32). package.path аналогично, добавляются два пути. Может пути по умолчанию добавлять до вызова luafar_init.lua? Чтобы можно было полностью переопределить.
Разум когда-нибудь победит.

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Sat 19 Aug, 2017 08:02

Smitis,
Опциональный файл %FARPROFILE%\luafar_init.lua - общий для всех LuaFAR-плагинов. Он вызывается ДО загрузки Lua-файлов плагина. Идея в том, чтобы добавить пути и/или выполнить какие-то действия общие для всех LuaFAR-плагинов.

Плагин LuaMacro модифицирует package.path и package.cpath для того, чтобы установить "стандартные" пути загрузки модулей. Большинство пользователей работают с плагином как он есть "из коробки", поэтому авторы модулей могут просто в доках написать: скопируйте xxx.lua в %FARPROFILE%\Macros\modules.

Если пользователь хочет полностью переопределить стандартные шаблоны загрузки, он может это сделать в %FARPROFILE%\Macros\scripts\_macroinit.lua, например так:

Code: Select all

if not package.already_redefined then
  package.already_redefined = true
  package.path = .....
  package.cpath = .....
end
Last edited by Shmuel on Sat 19 Aug, 2017 08:08, edited 1 time in total.

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

Lunatic Python

Post by Smitis » Sat 19 Aug, 2017 11:43

С файлом _macroinit.lua понятно, у меня сейчас так и делается, просто ищу какое-нибудь полезное применение для luafar_init.lua
Ладно, буду считать, что с этим файлом окончательно разобрались.
Разум когда-нибудь победит.

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Sat 19 Aug, 2017 11:51

Smitis wrote:
Sat 19 Aug, 2017 11:43
ищу какое-нибудь полезное применение для luafar_init.lua
У меня есть папки модулей (как *.lua, так и *.dll), не связанных с Фаром. Логично, что хочу их пользовать из Фара тоже (из всех LuaFAR-плагинов).
- В luafar_init.lua устанавливаю шаблоны поиска модулей.
- Те "стандартные" шаблоны, что добавляет плагин LuaMacro, не трогаю.
- _macroinit.lua у меня пустой.

tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

Lunatic Python

Post by tstr » Sat 26 Aug, 2017 10:04

пробую установить версию «lunatic-python-20170817.7z» из первого сообщения темы на ночной Far c новым профилем: Windows 7 x64 с обновлениями, устаовлена х64 anaconda 4.4.0 и обновлена из собственных репозитариев до python-3.6.2-0 в числе прочего. pygin грузится и работает как ожидается.

устанавливаю модуль lunatic-python-20170817.7z\lunatic-python\src\out\python36\64bit\python.dll в %FARPROFILE%\Macros\lib64 ,
а скрипт py-hash.lua в %FARPROFILE%\Macros\scripts , перегружаю Far, вызываю скрипт на любом файле, получаю вывод в консоль:
,
на sparkup-lunatic получаю
,

при этом sys.path, если его напечатать или вывести в файл - корректный.

в Sysinternals File Monitor видим, что при попытке найти модуль, загружаемый (как во второй ошибке) через python.import("sparkup") ищет как положено, в директориях питоновского sys.path, только вместо имени модуля ставит строку «<string>» :


похоже на ошибку, проявляющуюся в разных местах слегка по-разному, но связанную с имопртом Lunatic Python.

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Sat 26 Aug, 2017 11:18

tstr,
Прежде всего (как вы уже наверное поняли), я в Питоне не силён, многие тонкости (и не только) просто не знаю.

У меня установлен стандартный Python 3.6.2 x64 (не анаконда). В путях его нет.
По вашему совету, забросил в %FARHOME% python36.dll и python36.zip - в оба Фара - x86 и x64.

1. py_hash.lua работает в обеих битностях Фара.
2. Сейчас (впервые) попробовал sparkup_lunatic - он не запустился, ошибка вроде как у вас, но есть ещё непонятное мне сообщение в консоли:
Clipboard01.png
Clipboard01.png (30.61 KiB) Viewed 597 times
Пока идей нет, может потом появятся (в том числе с вашей помощью).

Shmuel
Posts: 5229
Joined: Thu 23 Mar, 2006 21:36
Location: Israel
Has thanked: 16 times
Been thanked: 151 times

Lunatic Python

Post by Shmuel » Sun 27 Aug, 2017 01:47

tstr, после замены обратных слешей на прямые, у меня заработало:
local dir = debug.getinfo(1,'S').source:match("@(.*)\\"):gsub("\\", "/")
Я у себя ещё добавил защиту от многократных добавлений этого пути в sys.path.

tstr
Posts: 513
Joined: Thu 16 Apr, 2009 16:15
Has thanked: 4 times
Been thanked: 5 times

Lunatic Python

Post by tstr » Sun 27 Aug, 2017 12:17

оказалось что директории поиска модулей портит pygin, буду в соотв. топике описывать.
и похоже что при наличии pygin lunatic получается после require "python" не полноценный - напим. в контексте питона отсутуствует модуль lua, который встроен в lunatic.

скрипт sparkup_lunatic подправил, там вообще постоянно не нужна папка со скриптом в sys.path - достаточно однократной загрузки в питоне модуля sparkup. обновил в соотв. теме.

Post Reply

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