Clarion & LUA || Python
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Clarion & LUA || Python
Ядро Lua занимает от 150 Kb -- см. вложение. Там есть пример на Delphi (неоткомпилированный).
Прошу прощения, сам не разбирался. Как возможность отметил, но поскольку необходимости не было, то и спустил на тормозах.
Если кто-то заинтересуется, заведите отдельную тему, чтобы не было off-topic.
Прошу прощения, сам не разбирался. Как возможность отметил, но поскольку необходимости не было, то и спустил на тормозах.
Если кто-то заинтересуется, заведите отдельную тему, чтобы не было off-topic.
- Вложения
-
- LuaDelphi2010-v1.3.zip
- (171.35 КБ) 179 скачиваний
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA
Апну тему. Интересно было бы реализовать!
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Clarion & LUA || Python
Там вроде действительно одну dll надо подложить. Libmaker создает lib-файл. А с прототипами надо разбираться. В комплекте идут заголовки для vc, для клариона что-то на вскидку не видно, а делать лениво, конкретных задач под это дело нет.
C6/C11, ШВС, tps/btrieve.
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
Накарябал небольшой пример вызова функции на питоне из 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()
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
И еще один пример.
Здесь выполняется код питона который вы сам написали. Перехватывается stdout питона и возвращается вам.
Сделано по второму примеру с этой страницы
Подробности по установке питона и что из DLL нужно в предыдущем примере.
Здесь выполняется код питона который вы сам написали. Перехватывается 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)
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4688
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 10 раз
- Поблагодарили: 37 раз
Clarion & LUA || Python
Под C6.3 примеры тоже работают. Не знаю, зачем все это может быть нужно, а вдруг... Респекты Админу.
C6/C11, ШВС, tps/btrieve.
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
Просто было интересно. Пусть будет, может пригодится когда.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
Немного обновил. Понадобилось по быстрому... и что бы с русским.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Clarion & LUA || Python
Сейчас актуальная версия Python - 3.6 . Кстати, сейчас сборка py3 по имени Anaconda входит в Visual Studio Community Edition и нормально поддерживается редактором и отладчиком VS
Когда-то делал интерфейс, но для Python2 - разница в передаче целых переменных и строк (В py3 строки в Юникоде). Там ещё передавались-принимались переменные, группы и очереди и возвращались сообщения об ошибках в Питоновских скриптах (кстати, очень важно)
Программы, вызывающие питоновские скрипты, у меня есть, но обычно собираю exe-файл через cx_freeze и его вызываю, а на выходе просто вывожу данные в файлы, а потом вычитываю Кларионом.
Если тема кому-то интересна, попробую найти в архивах и адаптировать на python3.
![Smile :)](./images/smilies/icon_smile.gif)
Когда-то делал интерфейс, но для Python2 - разница в передаче целых переменных и строк (В py3 строки в Юникоде). Там ещё передавались-принимались переменные, группы и очереди и возвращались сообщения об ошибках в Питоновских скриптах (кстати, очень важно)
Программы, вызывающие питоновские скрипты, у меня есть, но обычно собираю exe-файл через cx_freeze и его вызываю, а на выходе просто вывожу данные в файлы, а потом вычитываю Кларионом.
Если тема кому-то интересна, попробую найти в архивах и адаптировать на python3.
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
С LUA кстати тоже можно через lua53.dll работать.
Позже может кину пример.
Позже может кину пример.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Clarion & LUA || Python
У меня в Python 3.6 пример не запускается, падает на Py_Initialize() внутри ucrtbase.dll. Мои примеры, увы, делают то же самое. Однако стоило скопировать программу в каталог Python - всё запустилось. Отрадно... Значит, программе надо как-то сообщить о местоположении Python на компьютере...
Последний раз редактировалось Yufil 14 Июль 2017, 11:49, всего редактировалось 2 раза.
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
Забавно.
Попробовал мой последний пример компильнуть на C10 под Windows 10.
Падает при запуске на Py_Initialize.
Будем смотреть.
Попробовал мой последний пример компильнуть на C10 под Windows 10.
Падает при запуске на Py_Initialize.
Будем смотреть.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
Так с этим понятно. На работе python35.zip где то в пути sys.path лежит... а дома не было. положил и все ok.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 3963
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 29 раз
- Поблагодарили: 22 раза
- Контактная информация:
Clarion & LUA || Python
Пример на Python 3.6 так же работает. Только не забыть python36.zip в папку с программой бросить.
Внутри примера не работает строка
Что то там с сокетами... но это во внутрь getfile.py нужно смотреть. Код от балды написал.
Внутри примера не работает строка
Код: Выделить всё
MESSAGE(PY.RunFile('getfile.py')) ! получим index с google.ru
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса