2011-08-10 15 views
6

मैंने सोचा कि print कथन ने sys.stdout (डिफ़ॉल्ट रूप से) ऑब्जेक्ट पर सिर्फ .write() विधि कहा है।पायथन 'प्रिंट' कथन .write() विधि को कॉल नहीं करता है?

लेकिन इस तरह की एक उपवर्ग लिखा था:

import time 

class logfile(file): 
    def __init__(self, *args, **kwargs): 
     file.__init__(self, *args, **kwargs) 

    def write(self, logstr): 
     if logstr[-1] != '\n': logstr += '\n' 
     super(logfile, self).write(time.strftime('%D-%T ') + str(logstr)) 

यह अगर मैं एक logfile वस्तु बना सकते हैं और write विधि कॉल, लेकिन जब logfile की आवृत्ति sys.stdout वस्तु को बदलने की कोशिश कर काम करने के लिए लगता है यह ऐसा लगता है कि printwrite पर कॉल नहीं कर रहा है। शायद writelines?

इस का उपयोग करते हुए:

#!/usr/bin/python 

from myfile import logfile 
import sys 

sys.stdout = logfile('somefile', 'w') 

print 'this is a test' 
sys.stdout.write('this is another test') 

मेरे आउटपुट फ़ाइल 'somefile' शामिल हैं:

this is a test 
08/10/11-16:59:47 this is another test 

आप आउटपुट फ़ाइल में पहली पंक्ति देख सकते हैं कि मैं क्या print करने की कोशिश की और दूसरी पंक्ति है है sys.stdout.write

मैंने सोचा print सिर्फ write विधि कहा जाता है- स्पष्ट रूप से मुझे याद आ रही है मूलभूत कुछ।

+0

क्या http://stefaanlippens.net/redirect_python_print मदद कर रहा है? – Evpok

+1

'प्रिंट' का' stdout' का अपना संदर्भ है। – agf

+0

@Evpok मुझे लगता है कि अगर वह सामान्य लॉगिंग का उपयोग करने के बजाय प्रिंट रीडायरेक्ट करने का प्रयास कर रहा है तो शायद वह पूर्व-मौजूदा 'प्रिंट' कथन को संशोधित नहीं करना चाहता है। – agf

उत्तर

4

स्पष्ट रूप से यह पायथन 2 के कार्यान्वयन की एक सीमा है जहां प्रिंट साइड इफेक्ट्स के साथ अभिव्यक्ति के बजाय एक कथन है (जैसा कि यह पायथन 3 में है)।

मैं कुछ है कि अजगर 3 में काम करता है के लिए कोड दुबारा लिखा:

from io import FileIO 
import time 

class logfile(FileIO): 
    def __init__(self, *args, **kwargs): 
    FileIO.__init__(self, *args, **kwargs) 

    def write(self, logstr): 
    if logstr[-1] == '\n': logstr = logstr[:-1] 
    super(logfile, self).write(bytes(time.strftime('%D-%T ') + str(logstr), 'UTF-8')) 

import sys 

sys.stdout = logfile('somefile', 'w') 

print("This is a test") 
sys.stdout.write('this is another test') 

जहाँ तक मुझे पता के रूप में वहाँ अजगर 2 में समान व्यवहार

मैं भी from __future__ import print_function उपयोग करने की कोशिश बनाने के लिए कोई रास्ता नहीं है लेकिन इससे कोई फर्क नहीं पड़ता।

2

यदि आप फ़ाइल को आवृत्ति चर में डालते हैं, तो ऐसा लगता है कि यह काम करता है।

import time 

class logfile(object): 
    def __init__(self, *args, **kwargs): 
     self.f = file(*args, **kwargs) 
    def write(self, logstr): 
     if logstr[-1] != '\n': logstr += '\n' 
     self.f.write(time.strftime('%D-%T ') + str(logstr)) 

दुर्भाग्य से यह अतिरिक्त खाली लाइनों लॉग करता है, यहाँ एक समाधान है (print '2', '3', '4' 3 प्रविष्टियों लिखते हैं):

class logfile(object): 
    def __init__(self, *args, **kwargs): 
     self.f = file(*args, **kwargs) 
     self.c = False 
    def write(self, logstr): 
     self.c = not self.c 
     if logstr[-1] != '\n': logstr += '\n' 
     if self.c: 
      self.f.write(time.strftime('%D-%T ') + str(logstr)) 

यह एक लॉग पूर्ण लाइनों (ध्यान दें: print "4\n", "5" अभी भी 2 loglines है):

class logfile(object): 
    def __init__(self, *args, **kwargs): 
     self.f = file(*args, **kwargs) 
     self.newline = True 
    def write(self, logstr): 
     if self.newline: 
      self.f.write(time.strftime('%D-%T ')) 
     self.f.write(logstr) 
     self.newline = logstr[-1] == '\n' 

क्या कोई जानता है कि 1 लॉगलाइन में पूर्ण प्रिंट स्टेटमेंट कैसे प्रबंधित करें?

1

This article आपकी समस्या बताता है। असल में यदि sys.stdoutfile का उप-वर्ग है तो printsys.stdout.write बाईपास करता है और सीधे sys.stdout.fd पर लिखता है।

आपकी समस्या का समाधान file उपclassing के बजाय संरचना का उपयोग करना है।

+1

क्या आप एक उदाहरण दे सकते हैं? – Hobblin

संबंधित मुद्दे