2012-11-18 12 views
21

Kabuktan çalıştırılmak üzere tasarlanmış basit bir Python betiğinde, sys.stdin'in gerçek bir dosyadan başka bir işlemden geçirilen boruya yönlendirilip yönlendirilmediğini güvenilir bir şekilde belirleyebilir miyim?Sys.stdin bir dosyadan başka bir işlemden geçirilen pipetlenip yönlendirilmediğini nasıl belirleyebilirim?

Çalışma zamanı davranışını, stdin'in bir veri dosyasından gelip gelmediğine bağlı olarak, başka bir işlemden bir boru yoluyla akışa göre değişmek istiyorum. Her iki durumda da False değerini isatty() beklendiği gibi False olarak döndürür.

# test.py 
import os 
import sys 
print sys.stdin.isatty() 
print os.isatty(sys.stdin.fileno()) 

Test:

python test.py < file.txt 

üretir:

False 
False 

ve:

ls -al | python test.py 

üretir: Burada hızlı isatty() testi var

False 
False 

Bunu yapmanın pythonik bir yöntemi var mı? Unix/Linux'a özgü, gayet iyi olsa da, bunu taşınabilir bir şekilde yapmanın mümkün olup olmadığını bilmek güzel olur.

Düzenleme: Yorum yapanlar için not: Neden umurumda olsun? Eh, benim durumumda, başka bir süreçten pipetlendiğinde düzensiz aralıklarla gelen zaman damgalı verilerle uğraşmak istiyorum; Bir dosyadan önceden kaydedilmiş verileri oynattığımda, sabit veya değişken gecikmeler kullanarak tekrar oynatmak isterim.

Muhtemelen daha temiz bir yöntem kullanmanın (ve oynatma akışında gecikmeler eklemek için bir ara komut dosyası da dahil olmak üzere birkaçını düşünebilirim) avantajlı olduğunu kabul ediyorum, ancak ben terminal meraklısı.

+0

Neden ilgileniyorsun? Bu iki nokta birbirinden ayırt edilemez mi? Ls -al> dosya.txt && python test.py Eric

+0

İki ortam arasındaki zamanlamaları çoğaltmak istiyorum. İlk durumda, test.py'deki zaman damgalı verilerin çizgilerini (kayıtları) kabul ediyorum ve verileri ilk defa yakaladığım zamana benzer bir gecikme ile dosyadan veri işlemek istiyorum. – Inactivist

+2

@Eric 'in yorumunu sürdürürken, senaryonuzu iki olasılıkla yazmak daha iyi olmaz: ya stdin'den mi yoksa argüman olarak mı verilen bir dosyadan mı? –

cevap

24

Sen stat makrolar aradığınız:

import os, stat 

mode = os.fstat(0).st_mode 
if stat.S_ISFIFO(mode): 
    print "stdin is piped" 
elif stat.S_ISREG(mode): 
    print "stdin is redirected" 
else: 
    print "stdin is terminal" 
+0

Mükemmel! Bunu test ettim ve Linux ve Windows'da ilan edildiği gibi çalıştığını doğruladım. – Inactivist

+0

Yanıtlamadan önce kopyaları kontrol ettiniz mi? –

+1

@PiotrDobrogost: Bunun için uygun arama terimlerini bulmakta zorlandım. Tam olarak bir yineleme bulduysanız, bağlantıyı göndermekten ve bir closevote göndermekten çekinmeyin. – georg

İlgili konular