Clarion & LUA || Python

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Shur
Ветеран
Сообщения: 384
Зарегистрирован: 02 Июль 2011, 17:49

Clarion & LUA || Python

Сообщение Shur » 29 Октябрь 2015, 20:17

Ядро Lua занимает от 150 Kb -- см. вложение. Там есть пример на Delphi (неоткомпилированный).
Прошу прощения, сам не разбирался. Как возможность отметил, но поскольку необходимости не было, то и спустил на тормозах.
Если кто-то заинтересуется, заведите отдельную тему, чтобы не было off-topic.
Вложения
LuaDelphi2010-v1.3.zip
(171.35 КБ) 76 скачиваний

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA

Сообщение Admin » 30 Октябрь 2015, 13:44

Апну тему. Интересно было бы реализовать!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1369
Зарегистрирован: 06 Ноябрь 2014, 12:48

Clarion & LUA || Python

Сообщение finsoftrz » 30 Октябрь 2015, 14:26

Там вроде действительно одну dll надо подложить. Libmaker создает lib-файл. А с прототипами надо разбираться. В комплекте идут заголовки для vc, для клариона что-то на вскидку не видно, а делать лениво, конкретных задач под это дело нет.
Рязань решает.

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 01 Ноябрь 2015, 5:43

Накарябал небольшой пример вызова функции на питоне из Clarion.
Может будет кому интересно.

Код: Выделить всё

  PROGRAM

!
! по С++ примеру со страницы
! http://stackoverflow.com/questions/7283964/embedding-python-into-c-importing-modules
!
! дока Python/C API Reference Manual
! https://docs.python.org/3/c-api
!
! для работы примера нужно установить питон Python 3.5 32b
! python-3.5.0.exe
! c сайта https://www.python.org/downloads/release/python-350/
! и кинуть файлы python35.dll, vcruntime140.dll в папку с программой
!

PyObject        EQUATE(LONG)

  MAP
    MODULE('python35.dll')
      Py_Initialize(),LONG,RAW,C,NAME('Py_Initialize')
      PyRun_SimpleString(*CSTRING PyCode),LONG,PROC,RAW,C,NAME('PyRun_SimpleString')
      PyImport_AddModule(*CSTRING PyName),LONG,RAW,C,NAME('PyImport_AddModule')
      PyImport_ImportModule(*CSTRING PyName),LONG,RAW,C,NAME('PyImport_ImportModule')
      PyObject_GetAttrString(PyObject ObjectPtr, *CSTRING PyName),LONG,RAW,C,NAME('PyObject_GetAttrString')
      PyBytes_FromObject(PyObject ObjectPtr),LONG,RAW,C,NAME('PyBytes_FromObject')
      PyBytes_AsString(PyObject ObjectPtr),CSTRING,RAW,C,NAME('PyBytes_AsString')
      PyBytes_Size(PyObject ObjectPtr),LONG,RAW,C,NAME('PyBytes_Size')
      PyBytes_Check(PyObject ObjectPtr),LONG,RAW,C,NAME('PyBytes_Check')
      PyBytes_FromString(*CSTRING PyStr),LONG,RAW,C,NAME('PyBytes_FromString')
      Py_BuildValue(*CSTRING, *CSTRING),LONG,RAW,C,NAME('Py_BuildValue')
      PyEval_CallObjectWithKeywords(PyObject ObjectPtr, PyObject ObjectPtr1, LONG),LONG,RAW,C,NAME('PyEval_CallObjectWithKeywords')
      PyArg_Parse(PyObject ObjectPtr, *CSTRING, LONG hz),LONG,RAW,C,NAME('PyArg_Parse')
      PyUnicode_AsUTF8(PyObject ObjectPtr),CSTRING,RAW,C,NAME('PyUnicode_AsUTF8')
      Py_Finalize(),LONG,PROC,RAW,C,NAME('Py_Finalize')
    END
  END

strret          PyObject
mymod           PyObject
strfunc         PyObject
strargs         PyObject

cstr            CSTRING(200)
cstr1           CSTRING(200)
cstrret         CSTRING(200)

  CODE
  ! инициализаци питона
  Err# = Py_Initialize()

  ! грузим скрипт reverse.py
  cstr = 'reverse'
  mymod = PyImport_ImportModule(cstr)

  ! получаем объект-функцию
  cstr = 'rstring'
  strfunc = PyObject_GetAttrString(mymod, cstr)

  ! создаем объект-переменную
  cstr1 = '(s)'
  cstr = 'Hello World'
  strargs = Py_BuildValue(cstr1, cstr)

  ! вызываем функцию с переменной
  strret = PyEval_CallObjectWithKeywords(strfunc, strargs, 0)

  ! получаем результат выполнения функции
  MESSAGE(PyUnicode_AsUTF8(strret))

  ! выгружаем питон
  Py_Finalize()
2015-11-01 13-06-10.png
2015-11-01 13-06-10.png (1.34 КБ) 3099 просмотров
ClarionPy.zip
(16.92 КБ) 92 скачивания
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 01 Ноябрь 2015, 6:11

И еще один пример.
Здесь выполняется код питона который вы сам написали. Перехватывается stdout питона и возвращается вам.
Сделано по второму примеру с этой страницы
Подробности по установке питона и что из DLL нужно в предыдущем примере.

Код: Выделить всё

  PROGRAM

PyObject        EQUATE(LONG)

  MAP 
    MODULE('python35.dll')
      Py_Initialize(),LONG,RAW,C,NAME('Py_Initialize')        
      PyRun_SimpleString(*CSTRING PyCode),LONG,PROC,RAW,C,NAME('PyRun_SimpleString')
      PyImport_AddModule(*CSTRING PyName),LONG,RAW,C,NAME('PyImport_AddModule')
      PyObject_GetAttrString(PyObject ObjectPtr, *CSTRING PyName),LONG,RAW,C,NAME('PyObject_GetAttrString')
      PyBytes_FromObject(PyObject ObjectPtr),LONG,RAW,C,NAME('PyBytes_FromObject')
      PyBytes_AsString(PyObject ObjectPtr),CSTRING,RAW,C,NAME('PyBytes_AsString')
      PyObject_Str(PyObject ObjectPtr),LONG,RAW,C,NAME('PyObject_Str')   
      PyObject_Bytes(PyObject ObjectPtr),LONG,RAW,C,NAME('PyObject_Bytes')   
      PyUnicode_AsUTF8(PyObject ObjectPtr),CSTRING,RAW,C,NAME('PyUnicode_AsUTF8')   
      PyBytes_Size(PyObject ObjectPtr),LONG,RAW,C,NAME('PyBytes_Size')
      PyBytes_Check(PyObject ObjectPtr),LONG,RAW,C,NAME('PyBytes_Check')
      PyBytes_FromString(*CSTRING PyStr),LONG,PROC,RAW,C,NAME('PyBytes_FromString')
      Py_Finalize(),LONG,PROC,RAW,C,NAME('Py_Finalize')
    END
    PythonPrinting(*CSTRING inputStr),STRING
  END                             

PyCode          CSTRING(2000)  

  CODE
  Err# = Py_Initialize()
  PyCode = 'from time import time, ctime<13>print(''Today is'', ctime(time()))'
  !PyCode = 'print("Hello World")'
  MESSAGE(PythonPrinting(PyCode))
  Py_Finalize()                               
  
  
PythonPrinting  PROCEDURE(*CSTRING inputStr)!,STRING
loc:code        CSTRING(200) 
loc:tmp         CSTRING(200) 
pModule         PyObject
catcher         PyObject                  
output          PyObject
bytes           PyObject

  CODE
  loc:code = 'import sys<13>class CatchOut:<13>    def __init__(self):<13>        self.value = ''''<13>    def write(self, txt):<13>        self.value += txt<13>catchOut = CatchOut()<13>sys.stdout = catchOut<13>sys.stderr = catchOut'
  loc:tmp = '__main__'
  pModule = PyImport_AddModule(loc:tmp) 
  Err# = PyRun_SimpleString(loc:code)          
  Err# = PyRun_SimpleString(inputStr)          
  loc:tmp = 'catchOut'
  catcher = PyObject_GetAttrString(pModule,loc:tmp)
  loc:tmp = 'value'
  output = PyObject_GetAttrString(catcher,loc:tmp)
  RETURN PyUnicode_AsUTF8(output)
2015-11-01 13-09-02.png
2015-11-01 13-09-02.png (2.04 КБ) 3099 просмотров
ClarionPy2.zip
(16.47 КБ) 91 скачивание
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 1369
Зарегистрирован: 06 Ноябрь 2014, 12:48

Clarion & LUA || Python

Сообщение finsoftrz » 03 Ноябрь 2015, 20:50

Под C6.3 примеры тоже работают. Не знаю, зачем все это может быть нужно, а вдруг... Респекты Админу.
Рязань решает.

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 04 Ноябрь 2015, 6:06

finsoftrz писал(а): Под C6.3 примеры тоже работают. Не знаю, зачем все это может быть нужно, а вдруг... Респекты Админу.
Просто было интересно. Пусть будет, может пригодится когда.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 14 Июль 2017, 7:44

Немного обновил. Понадобилось по быстрому... и что бы с русским.
ClarionPy_6.3.zip
(1.29 МБ) 64 скачивания
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Yufil
Ветеран движения
Сообщения: 1170
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Clarion & LUA || Python

Сообщение Yufil » 14 Июль 2017, 9:49

Сейчас актуальная версия Python - 3.6 . Кстати, сейчас сборка py3 по имени Anaconda входит в Visual Studio Community Edition и нормально поддерживается редактором и отладчиком VS :)

Когда-то делал интерфейс, но для Python2 - разница в передаче целых переменных и строк (В py3 строки в Юникоде). Там ещё передавались-принимались переменные, группы и очереди и возвращались сообщения об ошибках в Питоновских скриптах (кстати, очень важно)
Программы, вызывающие питоновские скрипты, у меня есть, но обычно собираю exe-файл через cx_freeze и его вызываю, а на выходе просто вывожу данные в файлы, а потом вычитываю Кларионом.
Если тема кому-то интересна, попробую найти в архивах и адаптировать на python3.

Yufil
Ветеран движения
Сообщения: 1170
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Clarion & LUA || Python

Сообщение Yufil » 14 Июль 2017, 10:16

Тогда надо оставаться на 2.7, но поезд Python2 уходит...

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 14 Июль 2017, 10:53

С LUA кстати тоже можно через lua53.dll работать.
Позже может кину пример.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Yufil
Ветеран движения
Сообщения: 1170
Зарегистрирован: 16 Май 2006, 13:34
Контактная информация:

Clarion & LUA || Python

Сообщение Yufil » 14 Июль 2017, 11:27

У меня в Python 3.6 пример не запускается, падает на Py_Initialize() внутри ucrtbase.dll. Мои примеры, увы, делают то же самое. Однако стоило скопировать программу в каталог Python - всё запустилось. Отрадно... Значит, программе надо как-то сообщить о местоположении Python на компьютере...
Последний раз редактировалось Yufil 14 Июль 2017, 11:49, всего редактировалось 2 раза.

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 14 Июль 2017, 12:24

Забавно.
Попробовал мой последний пример компильнуть на C10 под Windows 10.
Падает при запуске на Py_Initialize.
Будем смотреть.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 14 Июль 2017, 12:32

Admin писал(а):
14 Июль 2017, 12:24
Падает при запуске на Py_Initialize.
Так с этим понятно. На работе python35.zip где то в пути sys.path лежит... а дома не было. положил и все ok.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Аватара пользователя
Admin
Администратор
Сообщения: 3479
Зарегистрирован: 05 Июль 2005, 14:59
Откуда: Хабаровск
Контактная информация:

Clarion & LUA || Python

Сообщение Admin » 14 Июль 2017, 12:36

Пример на Python 3.6 так же работает. Только не забыть python36.zip в папку с программой бросить.
Внутри примера не работает строка

Код: Выделить всё

MESSAGE(PY.RunFile('getfile.py')) ! получим index с google.ru
Что то там с сокетами... но это во внутрь getfile.py нужно смотреть. Код от балды написал.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса

Ответить