linux tee python ile çalışmıyor mu?


103

Sonsuz bir döngü kullanarak bir web sunucusuyla iletişim kuran bir python betiği yaptım. Her iletişim verisini bir dosyaya kaydetmek ve aynı zamanda bunları terminalden izlemek istiyorum. bu yüzden tee komutunu böyle kullandım.

python client.py | tee logfile

ancak, ne terminal ne de günlük dosyasından hiçbir şey almadım. python betiği iyi çalışıyor. burada ne oluyor? bir şey mi kaçırıyorum

bazı tavsiyeler takdir edilecektir. şimdiden teşekkür ederim.


3
Tamponlama, borular ve terminaller için farklı davranır. sys.stdout.flush()Bir satırı her günlüğe kaydettiğinizde betiğinizden bir açıklık yapmanız gerekebilir .
Lukas Graf

Arabelleğe alınmamış çıktıyı tetiklemenin diğer yolları için bkz. Stackoverflow.com/q/107705/1328439
Dmitri Chubarov

Yanıtlar:


181

Kimden man python:

   -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.read‐
          line()" inside a "while 1:" loop.

O halde yapabilecekleriniz:

/usr/bin/python -u client.py >> logfile 2>&1

Veya kullanarak tee:

python -u client.py | tee logfile

1
scriptArabelleğe almayı da devre dışı bırakan ve ek olarak kontrol dizilerinin ( C-a, imleç tuşları vb.) Çalışmasını sağlayan bir alternatif kullanım olabilir : stackoverflow.com/a/39269661/15690 .
blueyed

mükemmel! Raspbian Jessie ile donatılmış Raspberry Pi 3 cihazımda Python 3'te de çalıştı: python3 -u client.py | tee günlük dosyası
Antonino

Bir not: python, diğer çeşitli komutlar gibi, stdin ve stdout konsollarsa satır tamponlu kullanır, ancak sonuçlar bir dosyaya veya bir boruya yeniden yönlendirilirse tam tamponlanır. teemelez değil, bir boru (ki bu) gibi görülür: konsola yazar. Not: Davranış bir python programı içinde de kontrol edilebilir.
Giacomo Catenazzi

Başka bir not: python -u client.py | tee >> logfileişe yaramazdı. Bu >>, bir dosyaya başka bir arabelleğe alınmış yazma durumu sunar. Yani ne tee -açözer.
tanius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.