Udv!
Most belefutottam egy szamomra erdekes problemaba. A lenyeg, hogy volt egy haromszoros for ciklus egy python programban, amire grepet raktam, es fura volt, hogy egesz ejszaka semmit sem talalt. A problemas kodot sikerult erre a par sorra levezetni:
for i in xrange(0, 5):
print "%s %s" % ('alma', 'beka')
time.sleep(1)
Na most ezt ugye csak kiir masodpercenkent 1 sorba 2 szot (
\n
- nel a vegen) 5 alkalommal, majd kilep. Ha ugy futtatom, hogy
./prg.py
ez mukodik is, viszont ha ugy, hogy
./prg.py | grep -i a
azt csinalja, hogy 5 masodpercig nem ir ki semmit, majd 5 masodperc utan egybol az 5 sort. Ha megirom ugyanezt a programot shellben, nem all fent ez a problema.
Van valakinek otlete mi lehet ennek az oka? Ugye az a fura, hogy ha nincs grep, akkor masodpercenkent kiirja az outputot.
Na most pl. ha megprobalom beiranyitani egy fajlba az eredmenyt, akkor is csak 5 masodperc utan jelenik meg barmi is a fajlban, addig csak letrejon, de nem valtozik a (z ures) tartalma. Ha egy shell script generalja ugyanazt a tartalmat, minden normalis.
Koszi a valaszokat.
- 4121 megtekintés
Hozzászólások
Nem használtam még pythont, de nem lehet, hogy egy flush kell?
http://stackoverflow.com/questions/230751/how-to-flush-output-of-python…
Szerk. a stackoverflow-s linkről ide juthatsz: http://algorithmicallyrandom.blogspot.hu/2009/10/python-tips-and-tricks…
Elég erősen hasonlít a felvetésedre :)
- A hozzászóláshoz be kell jelentkezni
Ugye az a baj, hogy ha nem rakok ra valami atiranyitast, akkor megjelenik rendesen a terminalon... .
- A hozzászóláshoz be kell jelentkezni
Egy
sys.stdout.flush()
valoban megoldja a problemat, de most egy vilag dolt ossze bennem. Hogy mukodik akkor ez az atiranyitas? (
|, >
)? Honnan szedi az adatokat? Miert kell Neki flush, ha egyszer a terminalon ott van mar az adat?
- A hozzászóláshoz be kell jelentkezni
| grep az mar pipe, amugy python -u is megoldotta volna
- A hozzászóláshoz be kell jelentkezni
Meg kell erősíteni az alapokat, és nem fog összedőlni a világ. :-)
Egyébként
#!/usr/bin/python -u
, és akkor nem kell a flush():
-u Force stdin, stdout and stderr to be totally unbuffered. On systems where it matters, also put stdin, stdout and stderr in
binary mode. Note that there is internal buffering in xreadlines(), readlines() and file-object iterators ("for line in
sys.stdin") which is not influenced by this option. To work around this, you will want to use "sys.stdin.readline()" inside a
"while 1:" loop.
-----
A kockás zakók és a mellészabások tekintetében kérdezze meg úri szabóját.
- A hozzászóláshoz be kell jelentkezni
Igen, ezt ertem, hogy bufferelve van, de ha igy van, akkor miert jelenik meg a konzolon?
- A hozzászóláshoz be kell jelentkezni
mert ha terminal a kimenet, akkor line buffered
a peldadbol:
probald ki igy: print "%s %s" % ('alma', 'beka'),
maris nem fogja kiirni
- A hozzászóláshoz be kell jelentkezni
egyebkent mondok egy altalanos megoldast is, ujabb coreutilsban benne van:
stdbuf
stdbuf -oL ./akarmi.py | grep akarmi
- A hozzászóláshoz be kell jelentkezni
Legfőbb problémád, hogy valószínűleg valami 20 évesnél nem régebbi OS-en próbálod. Keress rá, hogy buffered IO.
--------------------------------------
Unix isn't dead. It just smells funny.
- A hozzászóláshoz be kell jelentkezni
Igen, valoban, ez egy 6- os debian :- ). No de, ha nem rakok ra atiranyitast, a terminalon megjelenik rendesen, masodpercenkent a szoveg.
- A hozzászóláshoz be kell jelentkezni