2016-04-06 10 views
2

dinlenme atmak istiyorum.Linux boru okumayı bitirdim ama Tamam yüklenen olup olmadığını görmek için Stdout'a okuma sonra bir süreç başlıyor kod parçası var

Ondan sonra, ideal olarak /dev/null veya atar şey çıktı yönlendirmek istiyorum. Bu durumda (A) en iyi uygulama neydi ve (B) boru doluysa, yazma sürecine ne olacak? Boru dolduğunda ve okunmadığında/temizlenmediğinde engellenecek mi?

Amaç, /dev/null yönüne yönlendirme yapmak istiyorsa, bunu nasıl yapılacağını python ve subprocess.Popen ile göstermek mümkün mü?

proc = subprocess.Popen(command, stderr=subprocess.PIPE) 
while True: 
    if init_string in proc.stderr.readline(): 
     break; 

proc.stderr.redirect ?? 
+0

Komut dosyasını çalıştırabilir ve çıktısını "python firstprogram.py>/dev/null' –

+0

" dan kaldırabilirsiniz. Önce biraz okuduktan sonra atmam gerekir. – John

cevap

-2

tüm çıktı iptal etmek isterseniz:

import sys 
sys.stdout = open('file', 'w') 
print 'this goes to file' 

Everytime size baskı: Eğer kullanabilirsiniz Python onu yapmak istiyorsanız, Ancak

python your_script.py > /dev/null

, standart çıktı "dosya" dosyasına yönlendirildi,/dev/null veya istediğiniz herhangi bir dosyaya değiştirildi ve istenen sonuçları elde edeceksiniz.

+0

Teşekkürler, ancak bir kereden sonra STETRET okuma okumalarını derhal yönlendirmem gerekiyor. Okumamanın, bir süre sonra arabelleği dolduracağı ve buna yazmayı denediğinde çağrı sürecini engelleyeceğinden endişe duyuyorum. – John

+0

neyi okuduktan sonra? Stderr'den okumadığınız için ... –

+0

İşlemi başlatan komut, 'stderr' işleminden okur. Birkaç şeyin olup olmadığını kontrol etmek için birkaç init mesajı okur, ardından işlemi açık bırakır veya kapatır. Bu noktada çıktıyı yeniden yönlendirmek istiyorum, böylece "stderr" 'e yazma işlemi asla okunmayan bir arabelleğe zorlanmaz. – John

2

olarak bildiğim kadarıyla, bu yürütme başladıktan sonra bir alt sürecin dosya tanımlayıcıları kapatıp yeniden açmak için hiçbir yolu yoktur. Ve evet, OS'de sınırlı bir tampon var, bu yüzden borudan herhangi bir şey tüketmiyorsanız, sonunda çocuk süreci engelleyecektir. Bu, yazım bitiminden kapatılıncaya kadar borudan okumaya devam etmeniz gerektiği anlamına gelir. Eğer programın bu arada yararlı bir şeyler yapmaya devam etmek istiyorum

, ayrı bir iş parçacığı veri tüketen kısmı hareketli (denenmemiş) ele alalım:

def read_all_from_pipe(pipe): 
    for line in pipe: # assuming it's line-based 
    pass 

Thread(lambda: read_all_from_pipe(proc.stderr)).start() 

sorunu çözmek için başka yollar da olabilir, gerçi. Neden ilk etapta belirli bir çıkışı beklemeniz gerekiyor? Çocuğun “Tamam” yapmadıysa sıfır olmayan bir çıkış koduyla ölmesi gerekmiyor mu? Bunun yerine, çocuğun keyfi bir çıktıyı yazdırmak yerine, yapması gerekenleri kontrol edip edemeyeceğini kontrol edebilir misiniz?

+0

Teşekkürler! Bu durumdan korkuyordum. Muhtemelen önerdiğin gibi bir okuyucuyu çevireceğim, sadece israf etmiş gibiydi. – John

+0

Bunu yapmanın başka bir yolu, bir dosyaya yeniden yönlendirme yapmak ve daha sonra ana uygulamamın bu dosyayı okumasını sağlamak olabilir mi? – John

+0

Bölünen bir boru yapmanın bir yolu yoksa ve bunun bir parçası kapalı mı? – John

İlgili konular