Portál AbcLinuxu, 25. dubna 2024 23:48


Dotaz: PyGTK a pár problémů

11.5.2007 09:07 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
PyGTK a pár problémů
Přečteno: 167×
Odpovědět | Admin
Tak se konečně učím v pythonu a narazil jsem na pár problémů:

Řeším volání externí aplikace. Používám os.popen(), jenže ten čeká dokud se externí aplikace neukončí. Dejme tomu, že chci zavolat "top", který běží do nekonečna a chci z něj průběžně získávat data. Jak? Druhý problém je podobný. Externí aplikace běží v konsoli a vyžaduje napsat yes a potvrdit, aby běžela dál, takže potřebuju poradit, jak říct té apliaci, aby to napsala za mě. Snad chápete mé úmysly :-D
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.5.2007 09:22 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: PyGTK a pár problémů
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na takové věci je potřeba v pygtk buď udělat multithreadovou aplikaci (což není úplně snadné) nebo do hlavní smyčky událostí přidat select(), který bude navázán na standardní výstup té externě spuštěné aplikace.
Jestliže s tím teprve začínáš, tak nevolej "top", ale čti data přímo z /proc. Bude to rozežranější, ale aspoň se pohneš z místa.
A co se týče té aplikace, co vyžaduje "yes", máš několik možností:
- pošli jí "yes"
- pusť ji s parametrem "na nic se neptej a dělej"
- najdi řešení v pythonu a nepouštěj ji vůbec
Jo a když už pouštíš externí program, tak používej raději modul subprocess místo os.popen().
11.5.2007 09:35 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: PyGTK a pár problémů
Top jsem uvedl pouze jako příklad. Ve skutečnosti dělám graf. nadstavbu nad pacmanem a potřebuju poslat "pacman -S aplikace" a z něj získat výstup (info o závyslostech) a potom je potvrdit.
11.5.2007 10:22 Jan Martinek | skóre: 43 | blog: johny | Brno
Rozbalit Rozbalit vše Re: PyGTK a pár problémů
Aha, pacman nemám, tak zůstanu u toho příkladu s topem.
#!/usr/bin/env python
import gtk, gobject, subprocess, sys, time

class TOPwatch:
    def __init__(self):
        cmd = ['top', '-b', '-d', '3']
        process = subprocess.Popen(cmd, stdout = subprocess.PIPE)
        gobject.io_add_watch(process.stdout, gobject.IO_IN, self.newdata)
        w = gtk.Window()
        w.connect('destroy', gtk.main_quit)
        w.show()
        gtk.main()

    def newdata(self, fd, condition):
        print time.asctime(), 'new data!'
        sys.stdout.write(fd.readline())
        return True

top = TOPwatch()
Pomocí gobject.io_add_watch vyvolávám událost, jestliže jsou k dispozici nějaká data ke čtení. Je možné také přidat podmínku pro sledování, zda se dají nějaká data zapsat, což by znamenalo, že se objevil potvrzovací dotaz. Ale to nemám vyzkoušené.
regnarg avatar 11.5.2007 19:25 regnarg | skóre: 20 | blog: rm -rf /this/blog
Rozbalit Rozbalit vše Re: PyGTK a pár problémů
A pro poslání yes je samozřejmě třeba dát konstruktoru popen parametr stdin=subprocess.PIPE a potom lze použít process.stdin.write('yes\n'). A samozřejmě se vyplatí pro jistotu i process.stdin.flush() aby bylo zajištěno že odpověď se skutečně odešle a nevznikne někde deadlock.
S láskou se nerodíme, ale s láskou se stáváme lidmi. --Simone De Beauvoirová
11.5.2007 19:31 pepik | skóre: 16 | blog: nevim | Chlumec nad Cidlinou
Rozbalit Rozbalit vše Re: PyGTK a pár problémů
Díky, až se dostanu k mému PC, vyzkouším.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.