Re: [python] XML a XSLT transformace & Python
Martin Stiborský wrote: > Díky za nakopnutí k StringIO. Už mi to funguje. > Je ten stringIO potřeba? Nešlo by to nějak takhle? >>> from xml.etree.ElementTree import * >>> text = ' NECO ' >>> e = XML(text) >>> e.text ' NECO ' >>> e.tag 'xml' >>> e.attrib {'ble': 'bla'} >>> Použil jsem funkci XML(), což je totéž co fromstring(): >>> XML is fromstring True -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Jak udělat odpočítávání?
Mazlík wrote: > Ahoj :-) > > Potřebuju udělat script, kde by hned na začátku byl raw_input a > odpočítávání. Např: > > rozcestik = raw_input() > --- > Napište číslo podle nabídky a stiskněte ENTER > (1) Start > (2) Konfigurace > (3) Napoveda > (4) Konec > --- > > A teď chci, aby uživatel měl na tuto volbu např: 10 vteřin a pokud nic > neudělá, tak se do proměnné "rozcestik" vloží hodnota třeba "1" (Jako > kdyby místo něj napsal třeba jedničku a enter :-)) > > Pak mě napadla druhá varianta, že pokud by se script / program spustil > s určitým argumentem, tak by ta nabídka volby vůbec nebyla a proměnné > by se hodnota přiřadila sama. Jenže já pak potřebuju udělat .exe > (py2exe) a nejsem si jistý, jestli by toto argumenty fungovali na > 100pro a hlavně je to otrava psát parametry pro spuštění :) > > Mockrát dík :-) > Zaprvé píšu s křížkem po funuse a zadruhé tohle řešení bude fungovat jen na operačních systémech, což už poznamenal regnarG. Takže si toho nevšímejte :-) #!/usr/bin/python import sys, select r = select.select([sys.stdin], [], [], 5) if r[0]: choice = sys.stdin.readline() else: choice = 'default\n' print 'Tvoje volba:', choice -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] subprocess
Ahoj, jakým způsobem by se to dalo zreprodukovat? Výjimku se mi nedaří vyvolat, ani když periodicky zkouším pouštět 'sleep' s různými čekacími dobami: #!/usr/bin/python import subprocess, random while True: t = str(random.randint(1, 5)) print t process = subprocess.Popen(['sleep', t]) retvalue = process.wait() Ani když vytvořím binárku, která by měla běžet co nejkratší dobu, tj. #include int main(void){ return 0; } a pak ji zkouším neustále spouštět #!/usr/bin/python import subprocess while True: process = subprocess.Popen(['./pokus']) retvalue = process.wait() tak výjimku nedostanu. Může to záviset na platformě? -- Jan Martinek Šponar Josef wrote: > Skript ověřuje zda jsou splněny podmínky pro spuštění externích programů. > Když jsou splněny podmínky, pokusí se vytvořit nový proces a testuje > návratovou hodnotu. > > V případě, že externí program běží více než cca.5sekund, tak je vše v > pořádku. Ale může se stát, že program běží kratší dobu a "někdy" to projde v > pořádku a "někdy" to skončí popisovanou chybou. > Zkoušel jsem i popen2, výsledek stejný. > > Používam takovouto konstrukci: > try: >process = subprocess.Popen([prog_name]) >retvalue = process.wait() >if retvalue: > print 'program se sice povedlo pustit, ale neco selhalo' >else: > print 'vse OK' > except OSError, error: >print 'nepovedlo se ho pustit' >print error > > > > > -Original Message- > From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On Behalf Of Petr Nesládek > Sent: Thursday, August 23, 2007 11:42 PM > To: Konference PyCZ > Subject: Re: [python] subprocess > > >> Původní zpráva >> Od: Šponar Josef <[EMAIL PROTECTED]> >> Předmět: [python] subprocess >> Datum: 23.8.2007 13:18:06 >> >> >> Ahoj, nevíte někdo jak odstranit tuto podivnost při používání >> subprocess.wait(). >> PYTHON = 2.4 >> System = SunOS >> >> prog=SUB.Popen(cmd, stderr=SUB.PIPE, stdout=SUB.PIPE) >> retval=prog.wait() >> >> Traceback (most recent call last): >> File "av_rizeni.py", line 283, in ? >> main() >> File "av_rizeni.py", line 180, in main >> retval=prog.wait() >> File "/usr/local/lib/python2.4/subprocess.py", line 1007, in wait >> pid, sts = os.waitpid(self.pid, 0) >> OSError: [Errno 10] No child processes >> ___ >> Python mailing list >> Python@py.cz >> http://www.py.cz/mailman/listinfo/python >> > > Ahoj, možná sezeptám hloupě, ale ten subproces se rozběhne, nebo ne ? > > Případně co se vůbec děje do momentu než zkončí chybou ? > > Petr > > > > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Jak se typicky zjistuje, jestli soubor existuje?
Ondrej Beran wrote: > 1.8.07, Jan Martinek <[EMAIL PROTECTED]>: > >> jestliže soubor existuje, tak za zlomek sekundy už to nemusí být pravda. >> Ve většině případů se proto existence souboru nezjišťuje, ale prostě se >> zkusí nějaká operace a když vyhodí výjimku, něco se nepovedlo. > > To je sice pravda, nebo si ho muze otevrit neco jineho s nejakym denny > narokem. > > Ale ja to potrebuju pro vyhledani cesty k souboru, jehoz jmeno pak > predam dalsimu kusu softu ke zpracovani, do ktereho nemam moznost > zabudovat backtracking, aby si to prohledal sam. Tak v tom případě sis vlastně odpověděl sám hned na začátku, tedy os.path.isfile(). Jestli tu informaci potřebuješ kvůli backtrackingu, tak se koukni, jak je implementovaná funkce os.walk(). No a jestli programuješ něco zajímavého, tak napiš _podrobně_ co to bude a jistě se tu sejde spousta nápadů, protože je okurková sezóna a je houby co dělat. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Jak se typicky zjistuje, jestli soubor existuje?
Ahoj jestliže soubor existuje, tak za zlomek sekundy už to nemusí být pravda. Ve většině případů se proto existence souboru nezjišťuje, ale prostě se zkusí nějaká operace a když vyhodí výjimku, něco se nepovedlo. Pro inspiraci se podívej, jak je implementovaná funkce os.path.exists() def exists(path): """Test whether a path exists. Returns False for broken symbolic links""" try: st = os.stat(path) except os.error: return False return True Podobně například os.path.isfile(): def isfile(path): """Test whether a path is a regular file""" try: st = os.stat(path) except os.error: return False return stat.S_ISREG(st.st_mode) Je vidět, že obě funkce volají os.stat(). Zdroják k os.access teď nějak nemůžu najít. -- Jan Martinek Ondrej Beran wrote: > Ahoj vsichni, > > nalezl jsem nekolik zpusobu, jak se da zjistit, zda soubor existuje: > > os.stat() > os.access() > os.path.exists() > os.path.isfile() > > Co se nejcasteji pouziva? Nejjednodussi mi prijde isfile(), ale zrejme > nejspravnejsi bude access(). > > Nebo se mylim? > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] ctypes, globální proměnná v kni hovně
Už asi vím. Tohle funguje: >>> from ctypes import * >>> lib = CDLL('./testlib.so') >>> c_int.in_dll(lib, 'a') c_long(1243) >>> c_int.in_dll(lib, 'a').value = 5678 >>> c_int.in_dll(lib, 'a') c_long(5678) -- Jan Martinek Jan Martinek wrote: > Ahoj, > > mám soubor "testlib.c", který obsahuje jediný řádek, a to > > int a = 1243; > > Z toho udělám sdílenou knihovnu > gcc -shared testlib.c -o testlib.so > > natáhnu ji do pythonu pomocí ctypes > > >>> from ctypes import * > >>> lib = CDLL('./testlib.so') > >>> lib.a > <_FuncPtr object at 0xb7f3d7e4> > > což se zřejmě úspěšně podaří, ale vůbec netuším, jakým způsobem se > dostat k té hodnotě 1243. Nevíte to někdo? > Když mám v té knihovně nějaké funkce, tak s jejich voláním nemám > problém, ale nevím, jakým způsobem přečíst a změnit globální proměnnou. > > Díky > Jan Martinek > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] ctypes, globální proměnná v kni hovně
dir() mi vypíše tohle: ['__call__', '__class__', '__ctypes_from_outparam__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_b_base_', '_b_needsfree_', '_flags_', '_objects', '_restype_', 'argtypes', 'errcheck', 'restype'] Ostatně, lepší příklad na vyzkoušení než ten, který jsem prve napsal je lib = CDLL('libc.so.6') a jak teď třeba získat hodnotu errno? >>> lib.errno <_FuncPtr object at 0xb7f667e4> -- Jan Martinek rajcze wrote: > Ahoj, > > co ti vrati vypis > >>>> dir(lib.a) > > ? > > On 7/23/07, Jan Martinek <[EMAIL PROTECTED]> wrote: >> Ahoj, >> >> mám soubor "testlib.c", který obsahuje jediný řádek, a to >> >> int a = 1243; >> >> Z toho udělám sdílenou knihovnu >> gcc -shared testlib.c -o testlib.so >> >> natáhnu ji do pythonu pomocí ctypes >> >> >>> from ctypes import * >> >>> lib = CDLL('./testlib.so') >> >>> lib.a >> <_FuncPtr object at 0xb7f3d7e4> >> >> což se zřejmě úspěšně podaří, ale vůbec netuším, jakým způsobem se >> dostat k té hodnotě 1243. Nevíte to někdo? >> Když mám v té knihovně nějaké funkce, tak s jejich voláním nemám >> problém, ale nevím, jakým způsobem přečíst a změnit globální proměnnou. >> >> Díky >> Jan Martinek >> ___ >> Python mailing list >> Python@py.cz >> http://www.py.cz/mailman/listinfo/python >> > > ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] ctypes, globální proměnná v kni hovně
Ahoj, mám soubor "testlib.c", který obsahuje jediný řádek, a to int a = 1243; Z toho udělám sdílenou knihovnu gcc -shared testlib.c -o testlib.so natáhnu ji do pythonu pomocí ctypes >>> from ctypes import * >>> lib = CDLL('./testlib.so') >>> lib.a <_FuncPtr object at 0xb7f3d7e4> což se zřejmě úspěšně podaří, ale vůbec netuším, jakým způsobem se dostat k té hodnotě 1243. Nevíte to někdo? Když mám v té knihovně nějaké funkce, tak s jejich voláním nemám problém, ale nevím, jakým způsobem přečíst a změnit globální proměnnou. Díky Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] [pygtk] Global grab
regnarG wrote: > Mám následující problém, který se mi nepodařilo vyřešit ani po půlhodině > googlování. Potřebuji v PyGtk provést globální grab, tj. omezit veškerý > vstup kláves v rámci systému na jedno okno, jako to dělá např. > XScreenSaver nebo gksu. Zkoušel jsem gtk.gdk.keyboard_grab(w.window, 1, > 0), ale bezúspěšně. Existuje nějaké řešení ? > Zkus tohle (program bych nazval "napínavých deset sekund"): #!/usr/bin/python import gtk, gobject def konec(entry): gtk.gdk.keyboard_ungrab() gtk.main_quit() e = gtk.Entry() e.show() w = gtk.Window() w.add(e) w.show() w.connect('destroy', gtk.main_quit) def_win = gtk.gdk.get_default_root_window() gtk.gdk.keyboard_grab(def_win, True) gobject.timeout_add(1, konec, e) gtk.main() Nevím proč, ale neukazuje se kurzor. A když jsem si s tím hrál, tak jsem si dvakrát omylem zablokoval klávesnici a musel restartovat Xka. -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Posílání emailů
[EMAIL PROTECTED] wrote: > Dobrý den > poradil byste mi někdo jak posílat maily pomocí pythonu? > > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python Ahoj, tady jsem to už někomu psal: http://www.abclinuxu.cz/forum/show/128223#7 Uvedené řešení jsem od té doby mockrát reálně použil. -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Karel Šrot wrote: > To Jan Martinek: > Nemyslel. :-) Tebou uvadeny priklad totiz posle data pouze jednou, pote > zavre vstup a precte cely vystup. Toto neni interaktivni komunikace. Aha. V tom případě se podívej do zdrojáku modulu subprocess do metody communicate. Ta metoda by se asi dala použít přímo, kdyby na konci vždy nečekala na ukončení procesu (self.wait()), což ty nechceš. Abych pravdu řekl, to čekání na ukončení procesu považuju za nešťastný nápad. Kdyby to tam nebylo, bylo by to flexibilnější. -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] cteni odpovedi programu ze stdin
Karel Šrot wrote: > Co se tyce modulu subprocess a select.select(), nikde jsem nenasel > priklad, ktery by ukazoval/vysvetloval to, co potrebuji. Muzete nekdo > znaly napsat kratky skript, ktery treba zavola "cat", bude na vstupu > nacte radek (raw_input), nahradi mezery novymi radky (to proto, aby tech > radku bylo vic, tj. nemeli jsme predstavu o jejich poctu), poslal to do > vstupu "catu", precetl odpoved z vystupu a vypsal ji na obrazovku. Atd., > porad dokola. Myslel jsi to takhle? #!/usr/bin/python # -*- coding:utf-8 -*- import subprocess, sys while True: line = sys.stdin.readline() if not line: break lines = line.replace(' ', '\n') process = subprocess.Popen('cat', stdin = subprocess.PIPE, stdout = subprocess.PIPE) process.stdin.write(lines) process.stdin.close() for line in process.stdout: sys.stdout.write(line) #Vypiš na terminál > Jan Fuchs napsal(a): >> Ahoj, >> již mnohokrát zde proběhlo: >> >> http://www.py.cz/pipermail/python/2007-March/005717.html >> >> >> Tři z pěti pythonistů doporučují navždy zapomenout na >> >> os.system >> os.spawn* >> os.popen* >> popen2.* >> commands.* >> >> a použít raději modul subprocess, který nahrazuje (a doplňuje) všechny >> výše uvedené metody. >> >> >> S pozdravem Jan Fuchs >> Díky za citaci :-) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] pravidla
Radek Machulka wrote: > Dne pátek 04 května 2007 Petr Hodas napsal(a): >> Cau Radku, >> v příloze ti zasílám další změny a doplnění pravidel. >> >> Dále pak logo Kralovedvorska, ktere potřebujeme doplnit na hlavní stránku >> vebu jako media partner. Logo bylo být aktivní. díky > > Jasny, > jen to "aktivni" logo znamena, ze po kliknuti se presmeruje na jejich stranku > (odkaz)? A jestli jo, tak na jakou (http://www.kralovedvorsko.cz ?). Ma se to > otevrit v novym okne nebo v tom samym (jsem pro v tom samym)? A jeste jedna > vec, asi nejdulezitejsi: kam to mam dat :) ?? > > P.S.: Soubory s tema logama jsou dva. JPG a PSD. To jsou oba stejny? Ja nemam > PhotoShop, takze ten druhej neotevru... Zatim tam hodim jen Jpeg a pak se > uvidi, jinak tyhle loga je asi fakt lepsi ve vektoru...:))) Jasněže to otvírej v tom samým okně. Kdo chce nový okno, ten si klikne prostředním tlačítkem. No a pak kdyžtak změň v odkazu webová kamera slovo "5-ti" na "pěti" a jinak je to fajn :-) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] XML PARSER
[EMAIL PROTECTED] wrote: > Dobry den, > > jsem Pythoňátko které již tyden hledá nejake relevantni informace o > zpracovani XML souboru v Pythonu. Jedna se mi o rozparsovani XML > dokumentu do promenne , nejlepe slovniku , napr x = {} aby bylo mozne > cist hodnoty nasledovne: > > hodnotaA = x['tagA'] > hodnotaB = x['user'] > > Vzorovy XML: > > > > > Ahoj Světe > > > localhost > root > heslo > databaze > > > > > Poradi mi nekdo, nejlepe malym vzorovym prikladem. > > Predem dekuji za ochotu. > > Hexim > Mě to funguje, jestliže se vynechá ten "deklarační" řádek. Asi to není úplně košér, ale nevím, jak to udělat líp než takhle: #!/usr/bin/env python # -*- coding: utf-8 -*- from elementtree.ElementTree import * xml = ''' Ahoj Světe localhost root heslo databaze ''' rootelem = fromstring(xml) queue = [rootelem] while queue: elem = queue.pop() queue.extend(elem.getchildren()) print elem.tag, elem.text for k, v in elem.attrib.iteritems(): print k,v Tohle projde celý XML strom, najde všechny tagy, jejich atributy (ve formě slovníku) a texty. Obvykle se na to asi používá rekurze, ale přes zásobník mi to přišlo lepší. Užitečná metoda je taky getiterator() a spousta dalších. Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] V jakém jazyce je napsán modul "re "
Jan Kundrát wrote: > Jan Martinek wrote: >> Jak to tedy vlastně je? > > Podivej se na importy v jednotlivych modulech (a dale pokracuj > rekurzivne). Posleze dojdes az k modulu _sre a ejhle: > >>>> import _sre >>>> _sre > > > Hezky vecer, > -jkt > Ahá! No jasně, máš pravdu. Já jsem si chtěl ušetřit práci a myslel jsem si, že to přechytračím. Pustil jsem python, natáhl modul "re" a vzápětí pustil find /usr/lib64/python2.4/ -amin -1 abych se podíval, který modul se otvíral méně než před minutou. No a jaksi mi nedošlo, že to může být built-in ;-) No a když jsem viděl _tolik_ pythonovského kódu v sre*, tak jsem se vyděsil, že je v tom napsaný celý modul. Díky. Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] V jakém jazyce je napsán modul "re "
Zdravím, zajímalo by mě, jestli je modul pro regulární výrazy "re" napsán v Céčku nebo v Pythonu. Většinou je možné se dočíst, že je napsaný v C, nicméně nejsem schopen najít odpovídající knihovnu. Asi se špatně dívám, ale re.py, sre.py, sre_compile.py, sre_constants.py a sre_parse.py jsou čistě v pythonu a nic binárního nenatahují. Svou rychlostí (při jednoduché substituci) několikanásobně zaostává například za Perlem, což by tomu odpovídalo. Naproti tomu, zastaralý a zavrhovaný (obsolete, deprecated) modul "regex" je nejspíš určitě psaný v C a zkompilovaný (na mém počítači) do /usr/lib64/python2.4/lib-dynload/regex.so a je výrazně rychlejší než novější modul "re". Jak to tedy vlastně je? Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Tiny ERP
mess wrote: > No, je to dělané v pythonu a Gtk+ > Nějaká data z databáze by se dala zobrazit nejspíš pomocí TreeView. Pusť si pygtk-demo.py a koukni do sekce "Tree View" na ukázku ListStore. Jestli je to zhruba to co potřebuješ, podívej se do zdrojáku a taky si přečti tohle: http://www.pygtk.org/pygtk2tutorial/ch-TreeViewWidget.html ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] subprocess
Vladislav Ludík wrote: > Zdravím, > > jak odeslat v linuxu příkaz pomocí subprocess. > > V linuxu napíšu například: > > server:~# sendsms "číslo" "text" > > a ten mi přes nainstalovanou SMS bránu odešle "text" na zadané "číslo" > > Přes subprocess se mi to nedaří. > > Díky za radu import subprocess cmd = ['sendsms', 'cislo', 'text'] process = subprocess.Popen(cmd) a kdybys chtěl čekat na ukončení příkazu, tak ještě process.wait() Jo a je nutné to pouštět jako root? ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] editor pro Linux
Vladislav Ludík wrote: > Pro editaci programů v Pythonu používám IDLE pod Windows. Soubor pak > natáhnu do Linux několikerým způsobem, kde pak pokračuji v jeho ladění. > Při kopírování dříve naprogramovaných a odladěných částí do laděného > programu na Linuxu v Midnight Comander (MC) vznikají časové ztráty a > navíc MC není pro Python moc praktický. > > Dotaz: > > Může mi někdo doporučit vhodný editor pro Linux s podobnými vlastnostmi > jako IDLE pro Python? > Jestli jsi dosud editoval soubory v mc, tak se pro tebe jistě alternativa najde, protože skoro cokoli je lepší. Zrovna nedávno jsem procházel dlouhý seznam editorů na http://wiki.python.org/moin/PythonEditors Vybíral jsem podle těchto kritérií: - nějaká rozumná licence - zda existuje balíček nějakém repozitáři - kvůli pohodlí a taky je to známkou určité vyspělosti - vynechával jsem editory, co používají javu nebo nějaké úchylné grafické knihovny (třeba tk nebo wx) - taby pro přepínání mezi otevřenými soubory - vlastnosti uvedené zde http://www.py.cz/EditoryIDE pro kategorii "slušné" - ať to není "moloch" otestoval jsem asi sedm editorů a zakotvil u geany http://geany.uvena.de// nicméně existuje spousta dalších a mocnějších editorů, určitě si vybereš. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Jak udelat wait u popen.
> Pisu si scriptik kterej mi projde pomoci os.walk() zadany adresar se zalohama > a vsechny soubory se starsim datem nez pulnoc posledni soboty mi prekopiruje > na usb disky. Delam si tak offsite backup. A do dnes jsem to kopiroval > manualne, coz je pruda. :) Tak to zkus napsat v čistém pythonu. Bude to přenositelné, hodně se tím naučíš, budeš mít pod kontrolou co se děje a troufám si říct, že to poběží rychleji. > > Ve zkratce to jede zhruba takto: > > #Vymaz vse na usb disku: > os.popen('rm -rfv /mnt/usb/*') Typický příklad pro os.walk a parametrem topdown = False. Je potřeba rozlišit adresáře (které se mažou funkcí os.rmdir) a soubory + linky (ty se mažou os.remove). > > #prekopiruj files > For f in files: > os.popen('cp -v f /mnt/usb/') > os.popen('rm -v f') > Takže nejprve kopíruješ a pak mažeš? To lze nahradit jedinou funkcí os.rename(). > Samozrejme je kolem toho jeste spousta omacky ale tohle je kostra. A prave > potrebuji nejak cekat nez se mazani a kopirovani dokonci. Aha, takže ani nepotřebuješ číst z roury, je to tak? import subprocess cmd = subprocess.Popen(['sleep', '5']) cmd.wait() > Mozna by to slo nejak resit pomoci copyfile z shutil, nevim. > > Jojo, tam jsou docela užitečné věci. Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Jak udelat wait u popen.
David Michal wrote: > Zdravim, > > > > Zapasim s pouzitim os.popen. Potreboval bych vzdy pockat na dokonceni > subprocessu a pak teprve pracovat s jeho vystupem. V dokumentaci jsme > nasel ze existuji tridy Popen3 a 4 ktere maji metodu wait(). Ale v > modulu os je nemuzu najit. Jak si mam zadefinovat neco takoveho: > > > > a = os.popen('echo ahoj') > > a.wait() > > print a[1].readlines() > > > > ? > > > > Diky, > > David > Tři z pěti pythonistů doporučují navždy zapomenout na os.system os.spawn* os.popen* popen2.* commands.* a použít raději modul subprocess, který nahrazuje (a doplňuje) všechny výše uvedené metody. Můžeš zkusit to napsat takhle: import subprocess command = ['echo', 'ahoj'] echo = subprocess.Popen(command, stdout = subprocess.PIPE) print echo.stdout.readlines() Kdybys náhodou chtěl opravdu čekat na ukončení externího programu, tak k tomu slouží metoda wait, např. echo.wait() A vůbec - napiš přesně, čeho chceš dosáhnout a jaký externí program budeš pouštět. Třeba to ani nebude třeba :-) Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] lstrip
Jan Martinek wrote: > Hynek Beran wrote: >> Ahoj, >> mám script, který používá různé parametry. >> např. >> >> pyBackup.py --cfg=celyVyvoj.cfg >> >> ve scriptu mám : >> cfgFile = sys.argv[1].lstrip('--cfg=') >> >> očekával jsem, že mi takto napsaný řádek vrátí název souboru celyVyvoj.cfg . >> Uřízne to --cfg= >> >> Ale ono mi to vrátí elyVyvoj.cfg (odmaže i c znázvu souboru). Když tam >> zadám cokoli jiného do parametru , co nezačíná na c, tak to projde ... >> Pochopil jsem špatně funkce ? >> >> >> Díky za pomoc. >> >> -- >> Hynek BERAN >> > > Je to tím, že parametrem metody lstrip je řetězec obsahující seznam > znaků, které se mají uříznout. Např. > > >>> 'babalezekominem'.lstrip('ab') > 'lezekominem' > > Doporučuji tuto cestu opustit a použít modul OptionParser. Umí zacházet > s parametry, bere v úvahu jejich datové typy, je možné mu nastavit > defaultní hodnoty, vypisuje help a další užitečné věci, které by jinak > člověk musel dost složitě psát. > > Jan Martinek Ještě doplním ukázku: import sys from optparse import OptionParser usage = "usage: %prog [--cfg configfile]" parser = OptionParser(usage, version="%prog version 0.1") parser.add_option("-c", "--cfg", action = "store", type = "string", default = 'celyVyvoj.cfg', dest='cfgFile', help='Configuration file') (options, args) = parser.parse_args() print options.cfgFile Zkus to pustit s parametrem --help a uvidíš sám. Jan Martinek P.S. Ta konference je nějaká pomalá - napsal jsem svůj příspěvek a až teprve potom se ukázalo, že jdu s křížkem po funuse ;-) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] lstrip
Hynek Beran wrote: > Ahoj, > mám script, který používá různé parametry. > např. > > pyBackup.py --cfg=celyVyvoj.cfg > > ve scriptu mám : > cfgFile = sys.argv[1].lstrip('--cfg=') > > očekával jsem, že mi takto napsaný řádek vrátí název souboru celyVyvoj.cfg . > Uřízne to --cfg= > > Ale ono mi to vrátí elyVyvoj.cfg (odmaže i c znázvu souboru). Když tam > zadám cokoli jiného do parametru , co nezačíná na c, tak to projde ... > Pochopil jsem špatně funkce ? > > > Díky za pomoc. > > -- > Hynek BERAN > Je to tím, že parametrem metody lstrip je řetězec obsahující seznam znaků, které se mají uříznout. Např. >>> 'babalezekominem'.lstrip('ab') 'lezekominem' Doporučuji tuto cestu opustit a použít modul OptionParser. Umí zacházet s parametry, bere v úvahu jejich datové typy, je možné mu nastavit defaultní hodnoty, vypisuje help a další užitečné věci, které by jinak člověk musel dost složitě psát. Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Return hodnoty pod ifem bez možnosti pr ojetí cyklem
Ahoj, vždyť už jsi to skoro měl - stačilo ty výsledky appendovat do nějakého seznamu. Ale můžeš zkusit i ten yield nebo si třeba napiš malinkou třídu. A jde to i takhle: >>> barvy = ['cervena', 'modra', 'zelena'] >>> data = [1,2,3,4,5] >>> B = len(barvy) >>> D = len(data) >>> [barvy[x % B] for x in range(D)] ['cervena', 'modra', 'zelena', 'cervena', 'modra'] funguje to pro libovolné množství barev :-) Jan Martinek [EMAIL PROTECTED] wrote: > Vůbec se mi to nedaři vyřešit :( > ___ > Python mailing list > Python@py.cz > http://www.py.cz/mailman/listinfo/python ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Na vsetko cyklus for ?
superman wrote: >> line = f.readline() >> while line != '': # nebo taky while line: >> zpracuj(line) >> line = f.readline() >> >> Takhle je to opravdu správnější. > > A nemáte pocit, že tohle je drbání se levou rukou za pravým uchem? Že > prostě dvakrát opisovat co chci (tedy v tomto případě line = > f.readline()) je prostě trochu neelegantní? Až ten výraz bude trochu > složitější, pak teprve vynikne neelegantnost tohoto řešení. > > Miloslav Ponkrác Aby se neduplikoval kód, tak v těchto situacích obvykle píšu while True: line = f.readline() if not line: break zpracuj(line) nebo třeba while True: try: zpracuj(f.readline()) except KonecSouboru: break Zezačátku se mi to "while True" moc nelíbilo, ale zvykl jsem si. Je to způsob, jak napsat cyklus s podmínkou kdekoli. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Obsluha uživatelských chyb
Jakub Lucký wrote: > Tak, a je tu můj premiérový lamerský dotaz > > Mám jednoduchý kód > > promenna = input("zadej cislo:") > > což mi v konzoli zobrazí normální dotaz, pokud ovšem místo čísel zadá > dotyčný řetězec, vyhodí Python relativně ošklivý error... > Nejde to nějak "pořešit" aby se místo toho dával třeba ValueError? napadají > mě řešení přes Try/Except a Raise, ale nepodařilo se mi to zprovoznit > > Děkuji za radu > > Jakub > Ahoj, zkus tohle: while True: try: promenna = int(raw_input("Zadej cislo ")) break except ValueError: pass print promenna Raději bych se vyhýbal příkazu "input", protože mu jdou podstrčit různé věci - není moc bezpečný. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Zapis hexa cisla
> Ahoj, > potreboval bych poradit se zapisem hexa cisla tak aby bylo v jednom > bytu(pri odeslani socketem) - tedka to zapisuji > ADDR=chr(0x00)+chr(0x00)+chr(0x90) (vystup ma 3 bytu), nekdy potrebuji > zapsat i delsi retezec a timto zpusobem je to dosti pracne > > pb Ahoj, tohle by pomohlo? import socket ip = '255.255.255.224' ip_n = socket.inet_aton(ip) -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] pygtk, odchytávání událostí k lávesnice a myši
Ahoj, nevíte někdo, jak pomocí gtk zachytávat všechny události klávesnice a pohyby myší? Když napíšu tohle #!/usr/bin/env python import gtk def wakeup(widget, event): print "Event number %d woke me up" % event.type w = gtk.Window() w.add_events(gtk.gdk.KEY_PRESS_MASK | gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.SCROLL_MASK) w.connect("motion-notify-event", wakeup) w.connect("key-press-event", wakeup) w.connect("button-press-event", wakeup) w.connect("scroll-event", wakeup) w.show() gtk.main() Tak to na stisky kláves reaguje pouze tehdy, když je okno aplikace aktivní. A pohyby myši (a klikání) to zaregistruje jen když se kurzor myši nacházi uvnitř okna. Jak by se to dalo napsat, aby to zachytávalo všechno i když je hlavní okno neaktivní/minimalizované/schované? Stačil by mi link na nějakou jednoduchou aplikaci, která toto musí umět, například - blbinky, co měří vzdálenost, kterou urazil kurzor myši - prográmek, co upozorní uživatele, že už píše příliš dlouho a měl by si odpočinout - něco, co zjišťuje aktivitu/neaktivitu uživatele (různí IM klienti) - koulející oči, které se stále otáčejí za kurzorem myši (xeyes) - keyloggers - zlomyslné programy (jsou-li nějaké), co čenichají všechny stisky kláves (hesla) a schovávají je do souboru. - ??? Hledám něco, co je napsáno v čistém gtk bez přímého volání xlib. Díky ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] ukončení interpretu, zničení ob jektu
Jan Martinek wrote: > Zdravím, > > narazil jsem na záhadné chování pythonu. Jestliže pustím tento program > > class M: >b = 0 >def __del__(self): > M.b > > a = M() > > Nestane vůbec nic zvláštního. Ale když změním poslední řádek na > > a1 = M() > > tak to vyhodí výjimku > > Exception exceptions.AttributeError: "'NoneType' object has no attribute > 'b'" in 0x2ab50a28>> ignored > > Není to podivné, že záleží na názvu proměnné? > Ahoj, poslal jsem to jako bugreport a zde je vyjádření vývojářů: https://sourceforge.net/tracker/?func=detail&atid=105470&aid=1500167&group_id=5470 -- On shutdown time, Python clears each module by replacing all module entries with None. So at some point, it does a1 = None # or a1 = None and at some other point, it does M = None Depending on the order in which these happen, M might be None (i.e. might not be class M anymore) when __del__ runs. The order in which these happen depends on the order which the names have in the module's dict. This, in turn, depends on the hash values of the strings, modulo the size of the dictionary. Apparently, "a1" gets hashed after "M", but "a" gets hashed before "M". This isn't really a bug, atleast not one that we plan to fix. The order in which modules get emptied is unspecified, and it can easily happen that things are gone when some destructor runs. Classes should be written to be resistent against this behaviour, e.g. by writing def __del__(self): self.__class__.b = 0 # name "M" might be gone already Closing this as "won't fix". - Závěr je, že se nejedná o chybu, tedy alespoň ne takovou, kterou je v plánu opravit. Doporučuje se používat self.__class__. Děkuji všem za reakce. Zůstává mi ale pořád jedna nejasnost - jaktože to windowsářům tu výjimku nehází? Je tam jiné hashování+dict a je potřeba zvolit jiné názvy proměnných? Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] ukončení interpretu, zničení ob jektu
Jan Kundrát wrote: > Jan Martinek wrote: >> class M: >>b = 10 >>def __init__(self): >> self.b += 1 # což není totéž co self.b.__add__(1) >>def __del__(self): >> print self.b# Objekt instance >> print M.b # Objekt třídy >> >> a1 = M() >> >> >> by měl vypsat >> >> 11 >> 10 >> >> ale místo toho napíše 11 a pak spadne. Tedy alespoň u mě ;-) > > Nemel by spis vypsat 11 a 11? > Doufám, že nežiju v nějakých bludech, ale podle mě to má opravdu vypsat 11 10 Například tento program class M: b = 10 def __init__(self): print self.b, M.b, id(self.b) == id(M.b) self.b = 11 print self.b, M.b, id(self.b) == id(M.b) a = M() Vypíše 10 10 True 11 10 False Jestliže se odkážu na self.b aniž bych ho předtím inicializoval, tak Python tento název nenajde. Nicméně pokračuje dál v prohledávání jmenného prostoru, až narazí na M.b. Takže se self.b a M.b jeví jako tytéž objekty. Ale jakmile do self.b přiřadím nějakou (jinou) referenci, najde se při volání self.b přednostně. A od té chvíle už self.b a M.b není totéž. Pokud se ale pletu, tak mě prosím vyveďte z omylu. -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] ukončení interpretu, zničení ob jektu
> Dle meho skromneho nazoru M.b chybou je, ale z jineho duvodu. > Dovolim si civotat Python reference manual: > > Variables defined in the class definition are class variables; they are > shared by all instances. To define instance variables, they must be > given a value in the __init__() method or in another method. Both class > and instance variables are accessible through the notation > ``self.name'', and an instance variable hides a class variable with the > same name when accessed in this way. > > Dulezita je veta "Jak tridni, tak i instancni promenne jsou pristupne > pomoci zapisu ''self.jmeno'' ... > > Takze, kdyz zmenite M.b na self.b, docilite pozadovaneho efektu. > > slacker > Nemůžu změnit M.b na self.b především kvůli tomu, že bych pak nemohl demonstrovat to podivné chování v Pythonu ;-) Nevím, jestli si rozumíme, ale odkaz na M.b určitě není nesprávný zápis, jedná se o objekt patřící ke třídě. Není to totéž co self.b, ačkoli se to tak zezačátku (kvůli prohledávání jmenných prostorů) může zdát. Například tento program class M: b = 10 def __init__(self): self.b += 1 # což není totéž co self.b.__add__(1) def __del__(self): print self.b# Objekt instance print M.b # Objekt třídy a1 = M() by měl vypsat 11 10 ale místo toho napíše 11 a pak spadne. Tedy alespoň u mě ;-) -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] ukončení interpretu, zničení ob jektu
>> tento program >> >> class M: >>b = 0 >>def __del__(self): >> M.b >> >> a1 = M() >> >> vyhodí výjimku >> >> Exception exceptions.AttributeError: "'NoneType' object has no attribute >> 'b'" in > 0x2ab50a28>> ignored >> > > rekl bych ze tam i tak mas chybu v M.__del__ > Jakou chybu? Jestli máš na mysli to M.b tak se domnívám, že to chyba není. Ale nechci se o tom přít, protože i když ten řádek nahradím M.b = 0 tak to při ukončení programu taky vyhazuje tu výjimku. Zjistil jsem další věc - když kód vepíšu do intepretu, tak při ukončení výjimku nevyhodí. Zatímco když vytvořím soubor s tímtéž kódem a ten spustím, tak to výjimku vyhodí. Děje se tak na Linuxu ve verzích Pythonu 2.4.2 i 2.4.3. -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] ukončení interpretu, zničení ob jektu
Zdravím, narazil jsem na záhadné chování pythonu. Jestliže pustím tento program class M: b = 0 def __del__(self): M.b a = M() Nestane vůbec nic zvláštního. Ale když změním poslední řádek na a1 = M() tak to vyhodí výjimku Exception exceptions.AttributeError: "'NoneType' object has no attribute 'b'" in > ignored Není to podivné, že záleží na názvu proměnné? -- Jan Martinek ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Mod_python a uchovani dat v operacni pameti
Pavel Reznicek wrote: > Petr Mach wrote: > >> Máte špatně nastavenu češtinu. > > > Dekuji a omlouvam se. Nevim, jestli je zde preferovano nejake > specificke kodovani cestiny a co je tedy "spatne nastavena" cestina, > Obávám se, že jste píchl do vosího hnízda, protože máte špatně nastavený svůj Microsoft Outlook Express 6.00.2800.1506, v hlavičce mailu neposíláte charset a říkáte, že "zde je něco preferováno". Je vcelku lhostejné, jaké použijete kódování, ale musí být v mailu uvedeno. Tím bych chtěl uzavřít toto off-topic intermezzo a přikládám váš původní (zajímavý!!!) mail v čitelné podobě (doufám). Milí pythonýři, pokouším se nyní spřátelit s mod_pythonem. Děláme webovou aplikaci, která má sbírat data od klientů a zpátky poskytovat aktuální stav. Data se dají strukturovat jako slovník obsahující v klíčích řetězce a v hodnotách seznamy či tuply čísel. Původně jsme plánovali nějakého pythonového démona - bez mod_pythonu, který by data prostě uchovával v paměti, podle potřeby dost často aktualisoval (v řádu sekund) a také poskytoval. Aktualisace dat právě bude docela rychlá. Tak - a o co jde: Myslel jsem si, že když mod_python běží pod Apachem, což je démon, bude si zaslaná data pamatovat. Opak je pravdou. Apache občas modul přeimportuje nebo co a data se vyprázdní. Znamená to snad, že budeme nuceni uchovávat data v souboru či v databasi? Zatím jsem to udělal do souboru, ale bojím se, že se do disku na serveru časem prošoupe díra... :-) Pavel Řezníček ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] windows: spousteni externich programu
Petr Vaněk wrote: > Dne čtvrtek 23 březen 2006 15:20 Leos Pol napsal(a): > >>Mozna jsem presne neporozumel problemu, ale na spousteni externich >>binarek lze pouzit treba os.popen*. >> >>import os >>fd = os.popen3('dot -Tpng -o %s.png' % fname) >>fd[2].read() > > > ajaj, tu jedinou radku v dokumentaci jsem prehledl. Jen abych se ujistil: > * kdyz externi prog. sebehne v poradku, vsechno jede dal a v file > deskriptorech mam stdout, err atd. > * kdyz ale shell prog. nenajde, popr. prg. spadne s chybou, nezjistim to > jinak, nez pochybnym parsovanim spolecneho vystupu ze stdout_stderr. Pochopil > jsem to dobre? > > Opravdu se nechci vnucovat s tím modulem subprocess, ale ve srovnání s os.popen3 má jisté výhody: - parametry předává jako "list", takže nevzniknou problémy s mezerami v názvu souboru atd. - když nenajde binárku, tak způsobně vyhodí výjimku Například tento program: #!/usr/bin/env python import subprocess, os prog_name = 'false' try: process = subprocess.Popen([prog_name]) retvalue = process.wait() if retvalue: print 'program se sice povedlo pustit, ale neco selhalo' else: print 'vse OK' except OSError, error: print 'nepovedlo se ho pustit' print error otestuje všechny situace - jestli se program povedlo spustit a pokud ano, tak se ještě podívá na návratový kód. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] windows: spousteni externich programu
Ahoj, na spouštění externích programů vřele doporučuji modul subprocess. http://www.python.org/dev/doc/devel/lib/module-subprocess.html Měl by být součástí Pythonu od verze 2.4. Díky němu lze nahradit tyto moduly a funkce: os.system os.spawn* os.popen* popen2.* commands.* které byly každá pes jiná ves a subprocess celkem elegantně spojuje jejich vlastnosti. Binárku umí hledat i v $PATH. Zřejmě funguje i na windows. Honza Leos Pol wrote: > Mozna jsem presne neporozumel problemu, ale na spousteni externich > binarek lze pouzit treba os.popen*. > > import os > fd = os.popen3('dot -Tpng -o %s.png' % fname) > fd[2].read() > > Doufam, ze jsem pomohl. > Leo > > Petr Vane(k wrote: > >>zdar buh kristus vespolek. >> >>Resim takovy pikantni problemek. Muj skript dokaze potencialne vyuzit program >>treti strany, pokud je v systemu obsazen. Pochopitelne tento externi program >>muze byt nainstalovan kdekoli. >>Na U*XU to resim nedbale elegantne. napr.: >>retval = os.spawnlp(os.P_WAIT, 'dot', 'dot', '-Tpng', '-o', fname + '.png', f) >> >>coz mi zajisti, ze je-li 'dot' v $PATH, tak se spusti. A ted jadro civavy - >>os.span*p ve win neexistuji. Jak je obejdu nebo nahradim? Pouze pripominam, >>ze umisteni extreniho programu predem neznam. Ani prochazeni GB souborovych >>systemu mi neprijde dvakrat idealni. >> >>Ovsem, mohu udelat test na typ OS a uzivateli se vysmat, ale jde mi to tak >>nejak proti srsti... >> >>okult jogurt, satan banan! >>petr >> >> >> >>___ >>Python mailing list >>Python@py.cz >>http://www.py.cz/mailman/listinfo/python > > > ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] ioctl() v céčku funguje, v Pyth onu selže
Jan Martinek wrote: > Ahoj, > > když v Pythonu napíšu tohle, > > import tty, os, fcntl > fd = os.open('/dev/ttyS0', os.O_RDWR | os.O_SYNC) > fcntl.ioctl(fd, tty.TIOCMBIC, tty.TIOCM_DTR) > > tak to vyvolá výjimku > IOError: [Errno 14] Bad address > Aha, už vím. Musí se to předtím spakovat: fcntl.ioctl(fd, tty.TIOCMBIC, struct.pack('I', tty.TIOCM_DTR)) (v Céčku se předává pointer). Spletl jsem si to s tímhle: fcntl.ioctl(fd, tty.TIOCMIWAIT, tty.TIOCM_CTS) což se naopak nepakuje, protože se v Céčku udávají přímo flagy, nikoli pointer na ně. ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
[python] ioctl() v céčku funguje, v Pyth onu selže
Ahoj, když v Pythonu napíšu tohle, import tty, os, fcntl fd = os.open('/dev/ttyS0', os.O_RDWR | os.O_SYNC) fcntl.ioctl(fd, tty.TIOCMBIC, tty.TIOCM_DTR) tak to vyvolá výjimku IOError: [Errno 14] Bad address zatímco ekvivalentní program v C (puštěný na stejném stroji pod stejným uživatelem) #include #include #include #include int main(int argc, char **argv) { int fd, r; int iFlags = TIOCM_DTR; fd = open("/dev/ttyS0", O_RDWR | O_SYNC); if (fd == -1){ perror("Failed to open port"); return -1; } r = ioctl(fd, TIOCMBIC, &iFlags); /* Vynuluje DTR */ if (r == -1){ perror("TIOCMBIC failed"); return -1; } close(fd); return 0; } funguje a žádnou chybu nevyhodí. Netušíte, v čem může být rozdíl? Díky johny ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python
Re: [python] Referencia
On Thu, 2006-02-02 at 18:14 +0100, balky wrote: > Zdravim, > > pokial viem, tak ak do premennej priradim nieco, nepriradil som vlastne > obsah tej premennej, ale iba odkaz(pointer) na ten objekt. > > >>> a = [1,2,3] > >>> b = a > >>> print b > [1,2,3] > >>> a = [3,3,3] > >>> print a > [3,3,3] > >>> print b > [1,2,3] > > > Ako zabezpecim, aby sa pri zmene hodnoty a zmenila aj hodnota v b? Nie > je b iba odkaz na a? Alebo je to odkaz na ine a? > > balky Třeba takto: >>> a = [1,2,3] >>> b = a >>> a[:] = [3,3,3] >>> b [3, 3, 3] a nadále platí, že id(a) == id(b) ___ Python mailing list Python@py.cz http://www.py.cz/mailman/listinfo/python