Problém s externí aplikací – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Problém s externí aplikací – Python – Fórum – Programujte.comProblém s externí aplikací – Python – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Vlado
~ Anonymní uživatel
38 příspěvků
18. 7. 2011   #1
-
0
-

Ahoj
Mám problém s externí aplikací (exe soubor) v pythonu!
Aplikaci v pohodě spustím a předám ji argumenty. Aplikace udělá co po ní chci. Výsledek je v pořádku jenže aplikace se neukončí korektně a vygeneruje chybové hlášení: "...program přestal pracovat...".
Externí aplikaci spouštím v cyklu takže po každém volaní aplikace musím odkliknout chybové hlášení a cyklus běží dál - výsledky jsou v pořádku.
Zkoušel jsem aplikaci zpustit přes: os.system(aplikace, argumet) i přes subprocess.Popen(aplikace, argument) s různými argumenty bohužel se stejným výsledkem.

Jak problém vyřešit? Existuje např. nějaký způsob jak vynutit ukončení externí aplikace? Nebo je potřeba zachytiti to okno s chybovým hlášením a uzavřít ho?

Omlouvám se za možná blbý dotaz, v pythonu jsem začátečník.
Dík předem za pomoc

Nahlásit jako SPAM
IP: 80.188.198.–
Reklama
Reklama
KIIV+42
God of flame
18. 7. 2011   #2
-
0
-

#1 Vlado
a zkousel si se podivat taky na tu externi aplikaci? to co popisujes nezni moc jako problem pythonu

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Vlado
~ Anonymní uživatel
38 příspěvků
19. 7. 2011   #3
-
0
-

#2 KIIV
zkoušel, ale nikam to nevedlo. Aplikace funguje bez problémů pokud ji používám samostatně (asi je zavadějící nazývat to aplikace - je to jeden exáč, žádná instalace).
Zajímavé je, že prvních cca 200 spuštení aplikace v cyklu funguje bez problémů a až pak začne aplikace tuhnout! A pak už tuhne pořád.
O tom, že problém je v té aplikaci jsem přesvědčen. Ale protože do aplikace zasáhnout neumim tak bych chtěl ten problém nějak řešit právě v Pythonu.
Dík
 

Nahlásit jako SPAM
IP: 80.188.198.–
liborb
~ Redaktor
+18
Guru
19. 7. 2011   #4
-
+1
-
Zajímavé

#3 Vlado
Jenom škoda, že si tak důležitou skutečnost nenapsal hned do prvního příspěvku. Pokud to vydrží 200 spuštění a pak to začne blbnout, tak to vypadá, že se něco vyčerpá (systémové zdroje?). Zkus to nějak takto:

proc = subprocess.Popen (...)

...

if (proc.poll() is None):
   os.kill (proc.pid, signal.SIGTERM)

tj. přidat po ukončení programu ještě jeho ukončení :). Je možné, že tam zůstávají "viset".

Nahlásit jako SPAM
IP: 78.80.52.–
KIIV+42
God of flame
19. 7. 2011   #5
-
0
-

Liborb: treba je to klasickej ubercool windows terminal program - tj. na konci ceka na klavesy, aby uzivatele nemeli pocit, ze to nefunguje, kdyz to hned zmizne...

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Vlado
~ Anonymní uživatel
38 příspěvků
21. 7. 2011   #6
-
0
-

#4 liborb
Dík za radu. Bohužel to nepomohlo :( Zkoušel jsem to zprava, zleva - pořád stejný. Už jsem také zkoužel ve Win 7 vypnout službu Windows Error Reporting Service. Jediné co se změnilo byl vzhled chybového hlašéní. Znovu jsem se vrátil k hledání informací k aplikaci - zatím nic. Myslíte že by pomohlo zkusit to zpustit přes Win32Api?

Nahlásit jako SPAM
IP: 80.188.198.–
KIIV+42
God of flame
21. 7. 2011   #7
-
0
-

#6 Vlado
a zkousel si zapnout sledovani systemu a hlavne obsazeni RAM?

Jak se chova ten program? Ceka po vypsani dat na stisk klavesy? (ten externi samozrejme)

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
liborb
~ Redaktor
+18
Guru
21. 7. 2011   #8
-
0
-

#6 Vlado
A ještě doplním ... zkoušel si to na jiném počítači? A co se píše v event logu?

A co je to vlastně za externí aplikaci, jestli to zase není tajný   

Jinak Win API by šlo použít, ale nejspíš by si dopadl stejně.

Nahlásit jako SPAM
IP: 78.80.52.–
Vlado
~ Anonymní uživatel
38 příspěvků
21. 7. 2011   #9
-
0
-

#7 KIIV
sledování systému používám pořád, s pamětí podle mě problém není. Pamět se při každém přechodu cyklu uvolní. Externí program který spouštím v Pythonu je Zoomify Express (http://www.zoomify.com/express.htm). Program vlastně vytvoří dlaždice z jakékoliv obrázku. Je to exáč, který po spuštení zobrazí pouze dialogové okno pro výber souboru obrázku (jpg) ze struktury disků a složek v PC. Vybereš soubor, potvrdíš OK a je to. Výsledkem je složka s dlaždicemi původního obrázku. Takže podle mě program na nic nečeká.
Samozřejmě zkoušel jsem to na více PC (os: XP, Vista, Vin 7) - chování naprosto stejný. cca 200 přechodů chyklů OK, pak chybové hlášení při každém přechodu chyklu. V event logu je odkaz na chybu "ntdll.dll". Přemýšlel jsem, že ji nahradím jinou knižnicí z netu, ale pak jsem si to rozmyslel, protože každá kterou jsem stáhl měla jinou velikost. Hlavně neumím posoudit dopad takové výměny DLL. Ale vygooglil jsem, že pád toho "Zoomify" spustí jiný program z Win "WerFault.exe" který generuje právě to chybové hlášení. Cyklus se zastaví pokud to uživatel neodklikne. Kdybych věděl zachitit PID toho "WerFault" a automaticky to ukončit tak by to fungovalo (zkoušel jsem to přes cmd - taskkill /f /im "WerFault.exe"). Nebylo by to elegantní rešení, ale lepší než nic.

Nahlásit jako SPAM
IP: 80.188.198.–
liborb
~ Redaktor
+18
Guru
21. 7. 2011   #10
-
0
-

Pokud by si to chtěl řešit přes WinAPI, tak EnumProcesses vylistuje běžící procesy (jejich PID). Z těch PID se dají získat přes OpenProcess handly (HPROCESS). Pomocí toho se dá funkcí EnumProcessModules vylistovat všechny moduly procesu (HMODULE), u kterých se dá zjistit přes GetModuleBaseName jméno aplikace nebo knihovny.

Ještě předtím bych se podíval ve správci nebo přes nějaký jiný SW (možná i Process Explorer), co ti to v systému utíká. Jestli jsou to handly, GDI objekty nebo paměť nebo co vlastně, jestli to je tedy tím.

Nahlásit jako SPAM
IP: 78.80.52.–
Vlado
~ Anonymní uživatel
38 příspěvků
22. 7. 2011   #11
-
0
-

#10 liborb
Tak konečně se mi povedlo najít alespoň nějaké řešení!
Vykašlal jsem se na PID procesu programu "WerFault" a zavřel jsem to jednoduše (tupě) přes taskkill v Pythonu:

os.system("taskkill /im WerFault.exe /f")

Asi to není nejelegantnější řešení, ale zatím funguje. Alespoň jsem získal nějaký čas na hledání sofistikovanějšího řešení.
Win32Api určitě zkusím přes víkend.
Děkuji Všem za Váš čas a ochotu pomoct zoufalé lamě v nouzi. Díky. 

Nahlásit jako SPAM
IP: 80.188.198.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 20 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý