Autor Téma: Python4Delphi - 32 bitů  (Přečteno 369 krát)

Online starous

  • Mladík
  • **
  • Příspěvků: 89
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Python4Delphi - 32 bitů
« kdy: 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 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


Offline pepak

  • Padawan
  • ******
  • Příspěvků: 1524
  • Karma: 37
    • Pepak.net
Re:Python4Delphi - 32 bitů
« Odpověď #1 kdy: 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.

Online starous

  • Mladík
  • **
  • Příspěvků: 89
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Re:Python4Delphi - 32 bitů
« Odpověď #2 kdy: 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.


Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Python4Delphi - 32 bitů
« Odpověď #3 kdy: 15-10-2020, 14:06:11 »

Len info:Na D-Praxis založili samostatný oddiel pre Python4Delphi
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 106
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Python4Delphi - 32 bitů
« Odpověď #4 kdy: 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

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Python4Delphi - 32 bitů
« Odpověď #5 kdy: 15-10-2020, 15:05:39 »
Veľmi často neviem pochopiť logiku/myslenie MS ::)
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Online starous

  • Mladík
  • **
  • Příspěvků: 89
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Re:Python4Delphi - 32 bitů
« Odpověď #6 kdy: 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.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 106
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Python4Delphi - 32 bitů
« Odpověď #7 kdy: 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.

Offline František

  • Guru
  • *****
  • Příspěvků: 596
  • Karma: 6
    • Verze Delphi: primárne v XE5, občas 10.2.3 comunity
Re:Python4Delphi - 32 bitů
« Odpověď #8 kdy: 16-10-2020, 00:46:34 »
tak na okraj: a aké to má využitie?

Online starous

  • Mladík
  • **
  • Příspěvků: 89
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Re:Python4Delphi - 32 bitů
« Odpověď #9 kdy: 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.

Online starous

  • Mladík
  • **
  • Příspěvků: 89
  • Karma: 2
    • Verze Delphi: Delphi 7, Delphi 10.4
Re:Python4Delphi - 32 bitů
« Odpověď #10 kdy: 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.

Offline Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 5450
  • Karma: 41
    • Verze Delphi: W10 + Delphi 10.4 professional
Re:Python4Delphi - 32 bitů
« Odpověď #11 kdy: 16-10-2020, 18:43:32 »
Python patrí k jedným najobľúbenejším jazykom. Stúpa hore.
W10 64b, Delphi 10.4, FireBird 3.05
Expert na kladenie nejasne formulovaných otázok.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 106
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Python4Delphi - 32 bitů
« Odpověď #12 kdy: 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.

Offline Jan Fiala

  • Plnoletý
  • ***
  • Příspěvků: 106
  • Karma: 0
    • Verze Delphi: 10.4.1
    • PSPad editor
Re:Python4Delphi - 32 bitů
« Odpověď #13 kdy: 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.