Интеграция Python в скрипт Lua

lovandog

Активный
Автор темы
224
98
Версия MoonLoader
.026-beta
Ищу либ для использования пайтона в луа. Т.е. я вызываю функцию из скрипта луа и мне возращаются значения из функции в пайтоне.
 

D3.Pheonix

🎹
Модератор
2,867
1,644
Это сетка сгенерила ответ:
Вы можете использовать библиотеку lupa для интеграции Python в Lua. Lupa предоставляет интерфейс для вызова Python-функций из Lua и позволяет использовать Python-объекты в Lua. Вот пример использования lupa:

Lua:
lua
local lupa = require('lupa')

-- Create a Python interpreter
local interpreter = lupa.LuaRuntime()

-- Execute a Python statement
interpreter:execute('import math')

-- Call a Python function
local result = interpreter:eval('math.sqrt(4)')

-- Use a Python object
local list = interpreter:eval('[1, 2, 3]')
 
Последнее редактирование:

RedHolms

Известный
Проверенный
619
366
stdin/stdout/stderr будут унаследованы, так что любые действия с консолью будут норм
если wait = true (параметр create_sub_process) поток будет залочен, пока процесс не завершится, так же это можно сделав, вызвав метод wait у вернувшегося значения

Lua:
local ffi = require 'ffi'

ffi.cdef[[
  typedef int BOOL;
  typedef char* LPSTR;
  typedef const char* LPCSTR;
  typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
  typedef unsigned long DWORD;
  typedef void* LPVOID;
  typedef struct _STARTUPINFOA STARTUPINFOA, *LPSTARTUPINFOA;
  typedef struct _PROCESS_INFORMATION PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
  typedef unsigned short WORD;
  typedef unsigned char BYTE, *LPBYTE;
  typedef struct _DUMMY *HANDLE;

  struct _SECURITY_ATTRIBUTES {
    DWORD  nLength;
    LPVOID lpSecurityDescriptor;
    BOOL   bInheritHandle;
  };

  struct _STARTUPINFOA {
    DWORD  cb;
    LPSTR  lpReserved;
    LPSTR  lpDesktop;
    LPSTR  lpTitle;
    DWORD  dwX;
    DWORD  dwY;
    DWORD  dwXSize;
    DWORD  dwYSize;
    DWORD  dwXCountChars;
    DWORD  dwYCountChars;
    DWORD  dwFillAttribute;
    DWORD  dwFlags;
    WORD   wShowWindow;
    WORD   cbReserved2;
    LPBYTE lpReserved2;
    HANDLE hStdInput;
    HANDLE hStdOutput;
    HANDLE hStdError;
  };

  struct _PROCESS_INFORMATION {
    HANDLE hProcess;
    HANDLE hThread;
    DWORD  dwProcessId;
    DWORD  dwThreadId;
  }

  struct _DUMMY {
    int unused;
  };

  BOOL __stdcall CreateProcessA(
    LPCSTR                lpApplicationName,
    LPSTR                 lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL                  bInheritHandles,
    DWORD                 dwCreationFlags,
    LPVOID                lpEnvironment,
    LPCSTR                lpCurrentDirectory,
    LPSTARTUPINFOA        lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
  );

  DWORD __stdcall GetLastError();
  DWORD __stdcall WaitForSingleObject(
    HANDLE hHandle,
    DWORD  dwMilliseconds
  );
]]

-- create_sub_process(...):wait() will return one of these values
local WAIT_ABANDONED = 0x00000080
local WAIT_OBJECT_0 = 0x00000000
local WAIT_TIMEOUT = 0x00000102
local WAIT_FAILED = 0xFFFFFFFF

local create_sub_process

function main()
  create_sub_process("python", "my_script.py", true)
end

create_sub_process = function(name, commandLine, wait)
  local obj = {}

  obj.startup_info = ffi.new("STARTUPINFOA")
  obj.process_info = ffi.new("PROCESS_INFORMATION")

  obj.handle = ffi.C.CreateProcessA(
    name,
    commandLine,
    nil,
    nil,
    1,
    0,
    nil,
    nil,
    obj.startup_info,
    obj.process_info
  )

  if tonumber(ffi.cast("uintptr_t", obj.handle)) == 0 then
    error("Failed to create sub proccess '" .. name .. "' with command line: '" .. commandLine .. "'. Code: " .. ("%X"):format(ffi.C.GetLastError()))
  end

  obj.wait = function(self)
    assert(self, "Use : instead of .")

    return tonumber(ffi.C.WaitForSingleObject(self.handle, -1))
  end

  if wait then
    obj:wait()
  end
end
 
  • Вау
Реакции: paulohardy

lovandog

Активный
Автор темы
224
98
stdin/stdout/stderr будут унаследованы, так что любые действия с консолью будут норм
если wait = true (параметр create_sub_process) поток будет залочен, пока процесс не завершится, так же это можно сделав, вызвав метод wait у вернувшегося значения

Lua:
local ffi = require 'ffi'

ffi.cdef[[
  typedef int BOOL;
  typedef char* LPSTR;
  typedef const char* LPCSTR;
  typedef struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
  typedef unsigned long DWORD;
  typedef void* LPVOID;
  typedef struct _STARTUPINFOA STARTUPINFOA, *LPSTARTUPINFOA;
  typedef struct _PROCESS_INFORMATION PROCESS_INFORMATION, *LPPROCESS_INFORMATION;
  typedef unsigned short WORD;
  typedef unsigned char BYTE, *LPBYTE;
  typedef struct _DUMMY *HANDLE;

  struct _SECURITY_ATTRIBUTES {
    DWORD  nLength;
    LPVOID lpSecurityDescriptor;
    BOOL   bInheritHandle;
  };

  struct _STARTUPINFOA {
    DWORD  cb;
    LPSTR  lpReserved;
    LPSTR  lpDesktop;
    LPSTR  lpTitle;
    DWORD  dwX;
    DWORD  dwY;
    DWORD  dwXSize;
    DWORD  dwYSize;
    DWORD  dwXCountChars;
    DWORD  dwYCountChars;
    DWORD  dwFillAttribute;
    DWORD  dwFlags;
    WORD   wShowWindow;
    WORD   cbReserved2;
    LPBYTE lpReserved2;
    HANDLE hStdInput;
    HANDLE hStdOutput;
    HANDLE hStdError;
  };

  struct _PROCESS_INFORMATION {
    HANDLE hProcess;
    HANDLE hThread;
    DWORD  dwProcessId;
    DWORD  dwThreadId;
  }

  struct _DUMMY {
    int unused;
  };

  BOOL __stdcall CreateProcessA(
    LPCSTR                lpApplicationName,
    LPSTR                 lpCommandLine,
    LPSECURITY_ATTRIBUTES lpProcessAttributes,
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    BOOL                  bInheritHandles,
    DWORD                 dwCreationFlags,
    LPVOID                lpEnvironment,
    LPCSTR                lpCurrentDirectory,
    LPSTARTUPINFOA        lpStartupInfo,
    LPPROCESS_INFORMATION lpProcessInformation
  );

  DWORD __stdcall GetLastError();
  DWORD __stdcall WaitForSingleObject(
    HANDLE hHandle,
    DWORD  dwMilliseconds
  );
]]

-- create_sub_process(...):wait() will return one of these values
local WAIT_ABANDONED = 0x00000080
local WAIT_OBJECT_0 = 0x00000000
local WAIT_TIMEOUT = 0x00000102
local WAIT_FAILED = 0xFFFFFFFF

local create_sub_process

function main()
  create_sub_process("python", "my_script.py", true)
end

create_sub_process = function(name, commandLine, wait)
  local obj = {}

  obj.startup_info = ffi.new("STARTUPINFOA")
  obj.process_info = ffi.new("PROCESS_INFORMATION")

  obj.handle = ffi.C.CreateProcessA(
    name,
    commandLine,
    nil,
    nil,
    1,
    0,
    nil,
    nil,
    obj.startup_info,
    obj.process_info
  )

  if tonumber(ffi.cast("uintptr_t", obj.handle)) == 0 then
    error("Failed to create sub proccess '" .. name .. "' with command line: '" .. commandLine .. "'. Code: " .. ("%X"):format(ffi.C.GetLastError()))
  end

  obj.wait = function(self)
    assert(self, "Use : instead of .")

    return tonumber(ffi.C.WaitForSingleObject(self.handle, -1))
  end

  if wait then
    obj:wait()
  end
end
Код:
[ML] (error) main.lua: ...ames\SAMP\gta by pashtet\moonloader\main.lua:72: '<identifier>' expected near 'struct' at line 47
stack traceback:
    [C]: in function 'cdef'
    ...ames\SAMP\gta by pashtet\moonloader\main.lua:72: in main chunk
[ML] (error) main.lua: Script died due to an error. (368CE1CC)

1675086517069.png

1675086542846.png
 
  • Грустно
Реакции: qdIbp

lovandog

Активный
Автор темы
224
98
; добавь после структуры _PROCESS_INFORMATION
Код:
[ML] (error) autoreply-openai.lua: ...ames\SAMP\gta by pashtet\moonloader\main.lua:88: bad argument #2 to 'CreateProcessA' (cannot convert 'string' to 'char *')
stack traceback:
    [C]: in function 'CreateProcessA'
    ...ames\SAMP\gta by pashtet\moonloader\main.lua:88: in function 'create_sub_process'
    ...ames\SAMP\gta by pashtet\moonloader\main.lua:122: in function <...ames\SAMP\gta by pashtet\moonloader\main.lua:121>
[ML] (error) main.lua: Script died due to an error. (0E2448B4)

и вот это после создания потока происходит

Код:
[ML] (error) autoreply-openai.lua: ...ames\SAMP\gta by pashtet\moonloader\main.lua:88: bad argument #2 to 'CreateProcessA' (cannot convert 'string' to 'char *')
stack traceback:
    [C]: in function 'CreateProcessA'
    ...ames\SAMP\gta by pashtet\moonloader\main.lua:88: in function 'create_sub_process'
    ...ames\SAMP\gta by pashtet\moonloader\main.lua:122: in function <...ames\SAMP\gta by pashtet\moonloader\main.lua:121>
[ML] (error) main.lua: Script died due to an error. (0E2448B4)

и вот это после создания потока происходит
1675086864386.png
 

Mov

Известный
127
9
Это сетка сгенерила ответ:


Lua:
lua
local lupa = require('lupa')

-- Create a Python interpreter
local interpreter = lupa.LuaRuntime()

-- Execute a Python statement
interpreter:execute('import math')

-- Call a Python function
local result = interpreter:eval('math.sqrt(4)')

-- Use a Python object
local list = interpreter:eval('[1, 2, 3]')
Это как понять он пишет на питон и исползует библиотеку и интегрировает в lua код сам меняется на луа ?
 
  • Bug
Реакции: qdIbp

lovandog

Активный
Автор темы
224
98

Это сетка сгенерила ответ:


Lua:
lua
local lupa = require('lupa')

-- Create a Python interpreter
local interpreter = lupa.LuaRuntime()

-- Execute a Python statement
interpreter:execute('import math')

-- Call a Python function
local result = interpreter:eval('math.sqrt(4)')

-- Use a Python object
local list = interpreter:eval('[1, 2, 3]')
где скачать эту либу? на гитхабе чисто пайтон файлы, нет либы на луа
 

lovandog

Активный
Автор темы
224
98
нигде, вероятно, это ж ответ нейросети хахвахвах
нет, ну она существует я смотрел но просто на гитхабе вообще нету файлов луа которые можно было бы в самп добавить как библиотеку
 

moreveal

Известный
Проверенный
925
623
нет, ну она существует я смотрел но просто на гитхабе вообще нету файлов луа которые можно было бы в самп добавить как библиотеку
так она существует, но для пайтона, воспроизводить луа код