मैं दुभाषिया इनपुट और त्रुटि और मानक आउटपुट दोनों के लिए वास्तविक समय तक पहुंच प्राप्त करना चाहता हूं। अधिमानतः यह जानकारी किसी फ़ाइल में लिखी जाएगी, ताकि प्रत्येक दुभाषिया कमांड दर्ज करने के बाद मैं परिवर्तन के लिए फ़ाइल को मतदान कर सकूं। उदाहरण के लिए, एक दुभाषिया सत्र दिया:पायथन इंटरैक्टिव शैल सत्र में होने वाली हर चीज को कैसे लॉग करें?
>>> 5 * 7
35
>>> print("Hello, world!")
Hello, world!
>>> "Hello, world!"
'Hello, world!'
मैं एक लॉग फ़ाइल में निम्नलिखित देखना चाहते हैं:
> 5 * 7
35
> print("Hello, world!")
Hello, world!
> "Hello, world!"
'Hello, world!'
स्वरूपण महत्वपूर्ण नहीं है; महत्वपूर्ण बात यह है कि मैं सत्र के दौरान इंटरैक्टिव घटनाओं को ट्रिगर करने के लिए कुंजी शब्दों के लिए फ़ाइल खोज सकता हूं।
मैं अब तक क्या सीखा है यह पूरा करने की कोशिश कर रहा:
पायथन के code
मॉड्यूल मुझे एक InteractiveConsole
वस्तु बनाने के लिए अनुमति देता है, raw_input
विधि जिनमें से मैं, तो जैसे एक फाइल करने के लिए लॉग इन करने को फिर से परिभाषित कर सकते हैं:
import code
class LoggedConsole(code.InteractiveConsole):
def __init__(self, locals):
super(LoggedConsole, self).__init__(locals)
self.file = open('consolelog.dat', 'a')
def __del__(self):
self.file.close()
def raw_input(self, prompt=""):
data = input(prompt)
self.file.write(data+'\n')
return data
इसके अलावा, InteractiveConsole
का उपयोग करता है एक अंतर्निहित write
विधि त्रुटियों, जो मैं करने के लिए फिर से परिभाषित कर सकते हैं प्रवेश करने के लिए:
def write(self, data):
sys.stderr.write(data)
self.file.write(data+'\n')
मैं भी सीखा है कि निम्नलिखित स्निपेट सभी stdout प्रवेश करेंगे:
class Tee(object):
def __init__(self):
self.file = open('consolelog.dat', 'a')
self.stdout = sys.stdout
def __del__(self):
sys.stdout = self.stdout
self.file.close()
def write(self, data):
self.file.write(data)
self.stdout.write(data)
sys.stdout = Tee()
मेरे (टूट) यह सब एक साथ फिर एक LoggedConsole
वस्तु बनाने के लिए था लाने के लिए, और स्थानीय लोगों में यह Tee
पारित करने के लिए प्रयास करते हैं।
console = LoggedConsole(locals={sys.stdout:LoggedExec()})
console.interact()
(मैं पारित नहीं किया गया है स्थानीय लोगों से पहले, तो शायद मैं इसे गलत तरीके से यहाँ कर रहा हूँ, लेकिन मैं एक त्रुटि प्राप्त नहीं है।)
फिर भी, यह एक नए इंटरएक्टिव कंसोल खुल जाएगा, और सभी इनपुट और त्रुटियों को बंद कर देगा (लेकिन बंद होने के बाद), लेकिन आउटपुट नहीं। मैं थोड़ी देर के लिए इसके खिलाफ अपने सिर को टक्कर लगी हूं, और मुझे लगता है कि मैं करीब हूं, लेकिन शायद यहां तक कि नहीं।
इसके अलावा, क्या सत्र के दौरान ऐसा होने का कोई तरीका है? सत्र बंद होने के बाद वर्तमान में सभी लॉगिंग होती है।
आपके समय के लिए धन्यवाद, पाठ की दीवार के लिए खेद है।
संपादित करें: मैं पोर्टेबिलिटी उद्देश्यों के लिए मानक पायथन दुभाषिया में इसे पूरा करने में सक्षम होना चाहता हूं।
संपादन 2: जैम का स्निपेट मुझे जो भी चाहिए, उसे लॉग इन करने के लिए बहुत अच्छा काम करता है। किसी भी तरह से, हालांकि, मैं इसे वास्तविक समय में कर सकता हूं, सत्र को बंद करने की प्रतीक्षा करने के बजाय?
संपादित 3: इसे समझ लिया :)। अंतिम, काम टुकड़ा:
import code
import sys
class Tee(object):
def __init__(self, log_fname, mode='a'):
self.log = open(log_fname, mode)
def __del__(self):
# Restore sin, so, se
sys.stdout = sys.__stdout__
sys.stdir = sys.__stdin__
sys.stderr = sys.__stderr__
self.log.close()
def write(self, data):
self.log.write(data)
self.log.flush()
sys.__stdout__.write(data)
sys.__stdout__.flush()
def readline(self):
s = sys.__stdin__.readline()
sys.__stdin__.flush()
self.log.write(s)
self.log.flush()
return s
def flush(foo):
return
sys.stdout = sys.stderr = sys.stdin = Tee('consolelog.dat', 'w')
console = code.InteractiveConsole()
console.interact()
बीटीडब्ल्यू सुनिश्चित नहीं है कि आपका उपयोग केस क्या है लेकिन 'ipython notebook' एक इंटरैक्टिव वर्कफ़्लो के लिए एक बढ़िया इसके अलावा है, यदि आपने इसे अभी तक नहीं देखा है। – Kos