Forum Delphi.cz

Delphi => Obecné => Téma založeno: starous 14-10-2020, 21:25:29

Název: Python4Delphi - 32 bitů
Přispěvatel: starous 14-10-2020, 21:25:29
Ahoj,

zaujal mě webinář na využití Pythonu v Delphi.

Podle návodu v tomto videu https://www.youtube.com/watch?v=hjY6lBgrHhM (https://www.youtube.com/watch?v=hjY6lBgrHhM) jsem si nainstaloval knihovnu i Python.

Všechno funguje jak má, ale ke konci videa jsem si všiml, že všechny příklady jsou kompilovány pro 64 bitů a v případě 32bitové aplikace program skončil chybou, že se nepodařilo načíst knihovnu python32.dll. Autor to komentoval, že si nainstaloval jen 64bitovou verzi Pythonu, pokud by tam měl i 32bitovou, tak to bude v pořádku. Jenže mě to s 32bitovou verzí Pythonu nefunguje.

Prolezl jsem zdroják knihovny (soubor PythonEngine.pas), kde si pomocí funkce SafeLoadLibrary otevírají příslušnou DLL knihovnu Pythonu. Problém je v tom, že knihovna se nenačte a handle knihovny zůstane nulové. Kontroloval jsem si, jestli je cesta ke knihovně v pořádku, ale vše souhlasí. Zkoušel jsem tam zapsat cestu ke knihovně natvrdo i předchozí verzi Pythonu (aktuální je 3.9, tak jsem tam dal 3.8 ), ale výsledek je stejný.

Zkusil jsem i prázdný projekt, taky nic.

Kód: Delphi [Vybrat]
  1.     SouborKnihovny := 'c:\Users\uzivatel\AppData\Local\Programs\Python\Python38-32\python38.dll';
  2.  
  3.     HandleKnihovny := SafeLoadLibrary(SouborKnihovny);
  4.  
  5.     ShowMessage(IntToStr(HandleKnihovny));
  6.  

Nezkoušel jste to někdo rozběhnout? Nebo netušíte v čem by mohl být problém?

díky

Název: Re:Python4Delphi - 32 bitů
Přispěvatel: pepak 15-10-2020, 06:53:13
No a jaké handle ti to vypíše?

Pokud 0, tak ti chybí nějaká knihovna, na které python38.dll závisí. Použij Dependency Walker.
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: starous 15-10-2020, 10:13:48
Ano,  handle = 0.

Díky, ten program jsem neznal, nicméně nikam jsem se neposunul.

Pokud v tom programu otevřu Python39.dll v 64bitové verzi i v 32bitové verzi, zobrazí se celá řada chyb. Podle programu knihovna Python39.dll využívá VCRUNTIME140.DLL, kterou otevírá ze stejného adresáře jako Python39.dll. 

U 32bitové verze knihovny se navíc objevuje chyba s pro mě nelogickou hláškou "Modules with different CPU types were found". Problém je v tom, že další DLL soubory, které knihovna využívá, jsou uloženy v adresáři c:\windows\system32, ale označeny atributem CPU x64. Myslel jsem si, že v system32 jsou 32bitové dynamické knihovny.

Název: Re:Python4Delphi - 32 bitů
Přispěvatel: Stanislav Hruška 15-10-2020, 14:06:11

Len info:Na D-Praxis založili samostatný oddiel pre Python4Delphi
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: Jan Fiala 15-10-2020, 14:40:27
Myslel jsem si, že v system32 jsou 32bitové dynamické knihovny.

Naopak, tam jsou 64b aplikace a knihovny.
32b věci jsou v SysWOW64
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: Stanislav Hruška 15-10-2020, 15:05:39
Veľmi často neviem pochopiť logiku/myslenie MS ::)
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: starous 15-10-2020, 17:06:47
Myslel jsem si, že v system32 jsou 32bitové dynamické knihovny.

Naopak, tam jsou 64b aplikace a knihovny.
32b věci jsou v SysWOW64


Díky za vysvětlení. Pokud jsem python39.dll i vcruntime140.dll přesunul do adresáře SysWOW64, tak se to spustí. Musel jsem tedy upravit nastavení komponenty PythonEngine:
 - dllName = python39.dll
 - dllPath = c:\Windows\SysWOW64\

Vůbec se mi toto řešení ale nelíbí. Přeci musí mít Windows mechanismus, jak načíst systémové knihovny podle typu spuštěného programu.
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: Jan Fiala 15-10-2020, 17:50:49
Díky za vysvětlení. Pokud jsem python39.dll i vcruntime140.dll přesunul do adresáře SysWOW64, tak se to spustí. Musel jsem tedy upravit nastavení komponenty PythonEngine:
 - dllName = python39.dll
 - dllPath = c:\Windows\SysWOW64\

Vůbec se mi toto řešení ale nelíbí. Přeci musí mít Windows mechanismus, jak načíst systémové knihovny podle typu spuštěného programu.

Teoreticky nemusíš, Windows by měly pro 32b program přesměrovat SysWOW64 do System32. Navíc cesty jsou do těch složek namapované. Co kdybys DLLPath nechal prázdnou?

Další možnost je, že to dáš do složky k programu a budeš nezávislý na MS i na tonm, jaká verze Runtime je zrovna ve Windows.
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: František 16-10-2020, 00:46:34
tak na okraj: a aké to má využitie?
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: starous 16-10-2020, 17:20:04
Windows by měly pro 32b program přesměrovat SysWOW64 do System32. Navíc cesty jsou do těch složek namapované.
Tak té větě nerozumím, nenapsal si to obráceně?
Citace
Co kdybys DLLPath nechal prázdnou?
Když nechám DLLPath prázdnou, tak se knihovna Python4Delphi pokouší cestu zjistit v registrech, kam si tu informaci zapisuje instalační program Pythonu. Dohledal jsem, že myslím do verze 3.5 se dll knihovna python3x.dll zapisovala do adresáře System32, případně SysWow64, pak to změnili.

Samozřejmě variantou je upravit soubor PythonEngine.pas a změnit načítání dll knihovny pythonu podle svého.
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: starous 16-10-2020, 17:35:31
tak na okraj: a aké to má využitie?

Tak zatím především na hraní. Od pythonu si slibuju, že by v něm řešení některých věcí mohlo jít snadněji. Je to skriptovací jazyk s širokou uživatelskou základnou. Existuje k němu spoustu knihoven, vychází spoustu literatury. Zatím s ním ale žádné praktické zkušenosti nemám.

Knihovna Python4Delphi slibuje snadné předávání dat mezi Delphi a Pythonem v obou směrech.
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: Stanislav Hruška 16-10-2020, 18:43:32
Python patrí k jedným najobľúbenejším jazykom. Stúpa hore.
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: Jan Fiala 17-10-2020, 20:01:54
tak na okraj: a aké to má využitie?

Třeba rozšiřování funkčnosti aplikace uživatelsky.
Název: Re:Python4Delphi - 32 bitů
Přispěvatel: Jan Fiala 17-10-2020, 20:05:33
Windows by měly pro 32b program přesměrovat SysWOW64 do System32. Navíc cesty jsou do těch složek namapované.
Tak té větě nerozumím, nenapsal si to obráceně?

Ne. Pokud spustíš 32b aplikaci, tak Windows "virtualizují" - aplikaci předhodí 32b verzi System32, což je ve skutečnosti SysWow64, předhodí jí 32b verzi registrů atd. Pokud chceš třeba číst standardní verze registrů, musíš na to speciálním flagem při práci s registry.
Když nainstaluješ současně 32b a 64b verzi třeba Pythonu, 64b knihovny skončí v System32 a 32b knihovny v SysWow64.