Титла: Зареждане на Python27.dll от AutoIt или друг език
Публикувано от: PhrozenCrew в Apr 03, 2012, 11:15
Здравейте,
Има ли начин да използвам Python, като заредя динамично Python27.dll или (Python25.dll) в AutoIt или примерно в C++? И изобщо някой ползвал ли е подобна библиотека от динамичен език, като Python, Ruby, Perl, PHP без да има инсталирани тези интерпретатори, а само библиотека с базата на езика. Например, както може да се използва Assembler в C++. Представям си го като зареждане на динамична библотека с стандартните фукнции на дадения език и изпълнение на команди от този език (с eval, DLLCall или нещо подобно) и прихващане на изхода. Може би въпроса ми е глупав, но си мисля, че би трябвало да има начин. Иска ми се да е възможно, за да може да се съкрати писането. Предварително благодаря за всяка идея!
Титла: Re: Зареждане на Python27.dll от AutoIt или друг език
Публикувано от: clovenhoof в Apr 03, 2012, 13:45
Това са динамични библиотеки в Windows. Какво ще ги правиш в линукс?
Титла: Re: Зареждане на Python27.dll от AutoIt или друг език
Публикувано от: v_badev в Apr 03, 2012, 14:32
Може да ембеднеш Python ($2). Вероятността да нямаш инсталиран Python или Perl на Linux машина клони към нула. Даже на Mac OS X отдавна са част от стандартната инсталация.
Примера с асемблер е некоректен. Той е толкова близо до машинният код, че почти всички C++ компилатори имат вградена поддръжка на асемблер.
Титла: Re: Зареждане на Python27.dll от AutoIt или друг език
Публикувано от: PhrozenCrew в Apr 03, 2012, 14:59
Здравейте, Не искам да използвам Python под линукс, а под Win. И тъй като Python не може да се компилира до байт-код (има ембедери и пакетиращи програми, които правят exe-та) искам да използвам лесен за писане език, като AutoIt или друг компилируем език, като само добавя в директорията една DLL-библиотека и да използвам възможностите на някой от динамичните езици (в случая Python). Отделно от това, кода на Python ще ми е полезен, ако реша да направя програмата преносима, така че с малки промени да мога да я напасна да работи под Linux. Намерих примерен код на един пич Валери Иванов, който прави почти каквото искам - закача Python25.dll и изпълнява комади към интерпретатора. Използва DllCall: $res = DllCall($PyDLL, "int:cdecl", "PyRun_SimpleString","str",$Text) Ето и целия код на примерната програма на пичагата: ;============================ ;APy © Valery Ivanov, 2006 #include <GUIConstants.au3> #include <windowsconstants.au3> #include <Array.au3>
Global $Title = "APy - autoexecute python lines" local $res, $msg, $hWnd
;==================== ; Python DLL variables Global $PyDLL, $PyDLLPath = ".\python25.dll"
Global $Edit, $hSB
$hWnd = GUICreate($Title, 600, 500) GUISetBkColor (0xFFEFD5)
;------------- ;Buttons $Load = GUICtrlCreateButton("LoadFile", 50, 10, 100, 25) $RunPython = GUICtrlCreateButton("Run", 150, 10, 100, 25)
;Create an edit box with no text in it $Edit = GUICtrlCreateEdit("", 0, 50, 600, 430)
; See content of example below ;Example($Edit)
;StatusBar $hSB = GuiCtrlSBarCreate($hWnd, 600, "50;40")
PythonDll()
GUISetState(@SW_SHOW) While 1 $msg = GUIGetMsg() Select Case $msg = $GUI_EVENT_CLOSE Exit ;-------------------------------------------------------- Case $msg = $Load $Filename = FileOpenDialog("Choose Python Script", @ScriptDir, "All Files (*.py)", "1") $Text = FileRead($Filename) GUICtrlSetData($Edit,$Text) Case $msg = $RunPython RunPython($Edit) EndSelect WEnd ;----------------------------------- func PythonDll() local $res, $result $PyDLL = DllOpen ($PyDLLPath) if @error then MsgBox(48, "", "Can't open PythonXX.dll") $res = DllCall($PyDLL, "none", "Py_Initialize") if @error then MsgBox(48, "", "Can't init PythonXX.dll") endfunc
;----------------------------------- ; StatusBar creation func GuiCtrlSBarCreate($hWnd, $Width, $Parts) local $SB_SETPARTS = 0x404, $SBARS_SIZEGRIP = 0x0100, $SB_SETICON = 0x40F local $i, $res, $hSB, $stParts, $hIcon, $W = 0
$res = DllCall("comctl32.dll", "long", "CreateStatusWindow", "long", BitOR($WS_CHILD, $WS_VISIBLE,$SBARS_SIZEGRIP), "str", "", "hwnd", $hWnd, "int", 0) $hSB = $res[0] $Part = StringSplit($Parts,";") $dscParts = "int" for $i = 1 to $Part[0] - 1 $dscParts &= ";int" next $stParts = DllStructCreate($dscParts) $W = 0 for $i = 1 to $Part[0] $W += $Width*$Part[$i]/100 DllStructSetData($stParts,$i,$W) next $res = DllCall("user32.dll", "long", "SendMessage", "hwnd", $hSB, "int", $SB_SETPARTS, "int", $Part[0], "ptr", DllStructGetPtr($stParts)) $stParts = 0
;Icon set $hIcon = DllStructCreate("int") $res = DllCall("shell32.dll", "int", "ExtractIconEx", "str", @SystemDir & "\shell32.dll", "int", 1, "hwnd", 0, "ptr", DllStructGetPtr($hIcon), "int", 1) $res = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hSB, "int", $SB_SETICON, "int", 0, "hwnd", DllStructGetData($hIcon, 1)) DllCall("user32.dll", "int", "DestroyIcon", "hwnd", DllStructGetPtr($hIcon))
$res = DllCall("shell32.dll", "int", "ExtractIconEx", "str", @SystemDir & "\shell32.dll", "int", 21, "hwnd", 0, "ptr", DllStructGetPtr($hIcon), "int", 1) $res = DllCall("user32.dll", "int", "SendMessage", "hwnd", $hSB, "int", $SB_SETICON, "int", 1, "hwnd", DllStructGetData($hIcon, 1)) DllCall("user32.dll", "int", "DestroyIcon", "hwnd", DllStructGetPtr($hIcon))
$hIcon = 0
Return $hSB endfunc
;----------------------------------- func UpdateSB($PartNumber,$Text) local $SB_SETTEXT = 0x401 DllCall("user32.dll", "long", "SendMessage", "hwnd", $hSB, "int", $SB_SETTEXT, "int", $PartNumber, "str", $Text) endfunc
;----------------------------------- func PythonExec($Text) local $res $res = DllCall($PyDLL, "int:cdecl", "PyRun_SimpleString","str",$Text) if @error then MsgBox(48, "", "Can't execute command") _ArrayDisplay($res) return $res[0] endfunc
;----------------------------------- func RunPython($Edit) local $LineCount, $res, $result, $Line $Text = GUICtrlRead($Edit) $Line = StringSplit($Text,@LF) for $i = 1 to $Line[0] $Command = StringStripCR($Line[$i]) if $Command <> "" then UpdateSB(0,"Try Command: " & $Command) UpdateSB(1,"Running....") $res = PythonExec($Command) if $res then UpdateSB(1,"Result: command failed") else UpdateSB(1,"Result: command succeded") endif MsgBox(0,"RunPython","Executed command:" & $Command) endif next endfunc Сега остава да разбера как мога да добавям допълнителни модули - os, re...
Титла: Re: Зареждане на Python27.dll от AutoIt или друг език
Публикувано от: v_badev в Apr 04, 2012, 08:49
Не искам да използвам Python под линукс, а под Win. Значи си сбъркал форума.
Титла: Re: Зареждане на Python27.dll от AutoIt или друг език
Публикувано от: PhrozenCrew в Apr 04, 2012, 08:59
Възможно е и да съм се объркал, за което се извинявам, като съм пуснал тук темата, но ми се стори най-логично да е в: Форуми > Програмиране > Общ форум
С по-горния код мога да изпълнявам команди от Python, но само ако са на един ред. Ако трябва да напиша функция или доли най-простичък цикъл, дава грешка. Гадна работа! v_badev, мерси за линка. Имам инсталирана някаква порабъл версия на Dev-C++ и пробвах един пример, но нещо бъркам с закачането на длл-а. Довечера ще пробвам под Debian-а в къщи, дали мога да използвам ембедване с gcc.
Титла: Re: Зареждане на Python27.dll от AutoIt или друг език
Публикувано от: v_badev в Apr 04, 2012, 12:22
Като написах че си сбъркал форума, нямах в предвид грешна секция. Правилното място за въпрос за програмиране за Windows е в някой форум за програмиране, а не за Linux. Например http://bgdev.org/ ($2).
|