2012-10-04 11 views
6

Python'a oldukça yeni yaşıyorum, bu yüzden hala dili öğreniyorum. Karşılaştığım şeylerden biri, varsayılan baskı çıktılarını değiştirmek için sys.stdout'u yeniden atamaktı. Bu yüzden bir test olarak bu yazmış:sys.stdout sys .__ stdout__ için yeniden atama

import sys 
sys.stdout = open('log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = sys.__stdout__ 
print('hi') 

'Hey' dosyasına yazılır, ancak 'merhaba' hiçbir yerde görünür. madde gerçekten does not çok fazla, ben kısa onun küçük bir sorun olarak

import sys 
sys.__stdout__ = sys.stdout 
sys.stdout = open(r'C:\Users\Vincent\Documents\Python\log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = sys.__stdout__ 
print('hi') 

: 'merhaba' konsol çıkışına basılır beklenen ve 'hey' dosyasına yazılır ve Ancak, bu işleri sadece neden olması gerektiği gibi çalışmadığı fark edilebilir bir neden olup olmadığını merak ediyorum. Bunu Windows 7 Home Premium'da IDLE ve v3.2.3 üzerinde pyscripter ve taşınabilir python v3.2.1'de denedim.

+0

Bu betiği nasıl çalıştırıyorsunuz? İlk baskının işe yarayıp yaramadığını söylemedin. * Başta sys.stdout'a başka bir değişken atadığımda ve onu değiştirdiğimde çalışır. * Bunu gösteren kodu yazmak ve çıktılarını açıklamak daha iyi olurdu. –

cevap

0

I (sys.__stdout__ ortamınızı yapmış hiç çünkü hem sys.stdout ve sys.__stdout__ ayrı kullanarak değil) bu çözümü denemek istiyorum: sys.stdout referansı backuping

old_stdout = sys.stdout 
sys.stdout = open('log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = old_stdout 

bunu yapmak için en güvenli yolu görünüyor. Başka bir farklı durumda çalışır: stdout redirect from Jupyter notebook is landing in the terminal

2

IDLE'de, sys.__stdout__, programın orijinal standart çıktısıdır; Başka bir deyişle, IDLE'nin kendisi zaten sys.stdout'u başka bir şeyle (kendi konsol penceresi) değiştirdi, böylece stdout'u __stdout__ ile değiştirerek geriye iki adım atıyorsunuz.

İlgili konular