2012-08-10 14 views
7

पायथन में, निम्न कोड स्निपेट निष्पादन पर एक इंटरैक्टिव खोल खोल देगा।पायथन: code.interact (स्थानीय = स्थानीय()) जहां stdin/stdout उपलब्ध नहीं हैं

import code; code.interact(local = locals())

यह बहुत कम कोड में डीबगिंग के लिए बेहद उपयोगी साबित हुआ है जो खराब दस्तावेज है। कोई इन-प्रोग्राम वातावरण पर नेविगेट करने के लिए खोल का उपयोग कर सकता है और यह पता लगा सकता है कि क्या हो रहा है, यहां तक ​​कि डीबगर के बिना भी। अब तक सब ठीक है.

अब चुनौती।

सॉफ्टवेयर मैं उपयोग कर रहा हूँ (जो Django में लिखा है वैसे,) समय-निर्धारण व्यवस्था है जिसके फिर एक और अजगर प्रक्रिया को बोलता है किसी प्रकार का, जो करने के लिए मैं अपने कोड संपादन के अलावा अन्य पर कोई नियंत्रण नहीं उपयोग करता है। मेरे पास प्रसंस्करण के लिए भेजे गए चर के अलावा अन्य में कोई इनपुट नहीं है।

हालांकि, मुझे नहीं पता कि दस्तावेज दस्तावेज के बाद से काम करता है, इसलिए मैं चीजों को समझने के लिए code.interact विधि का उपयोग करना चाहता था।

लेकिन यह प्रक्रिया कुछ विशेष शेड्यूलिंग सॉफ़्टवेयर द्वारा पृष्ठभूमि में कहीं भी शुरू की गई है, इसलिए प्रवाह Django एप्लिकेशन से उन हिस्सों में नहीं जाता है जिन्हें मैं जांचना चाहता हूं। इसके बजाए, एक सिग्नल और ऑब्जेक्ट भेजा जाता है जिसे बाद में एक अनियंत्रित समय (10-200ms के बीच कहीं भी) पूरी तरह से अलग प्रक्रिया में चलाया जाता है। जब सिग्नल और ऑब्जेक्ट प्राप्त होता है, तो stdin/stdout पूरी तरह से तस्वीर से बाहर है।

तो मुझे लगा कि code.interact के साथ संवाद करने के लिए stdin/stdout का उपयोग करने के बजाय मैं readfunc पैरामीटर निर्दिष्ट करके फ़ाइल हैंडल या यूनिक्स सॉकेट का उपयोग कर सकता था। मैंने इसे open() फ़ाइल और सॉकेट में करने की कोशिश की है, लेकिन इसका कोई फायदा नहीं हुआ है।

अब मैं इसे केवल Django प्रक्रिया से ही काम करने की कोशिश कर रहा हूं, इसलिए शेड्यूलिंग समस्या प्रश्न से बाहर है, और जब इंटरैक्टिव शैल वास्तव में शुरू होता है, तो यह तुरंत बंद हो जाता है, न ही आदेशों के साथ फ़ाइल स्वीकार करता है सामग्री के रूप में, न ही यूनिक्स सॉकेट जिसमें पाइथन कमांड पाइप किए जाते हैं।

एक लंबी कहानी कम करने के लिए; क्या code.interact द्वारा stdin/stdout की तुलना में किसी अन्य माध्यम से एक इंटरैक्टिव खोल के साथ संवाद करना संभव है? यदि हां, तो कैसे?

अग्रिम धन्यवाद।

उत्तर

4

मैं शेड्यूलर और डीजेंगो और जो भी कुछ भी पूरी तरह से पालन नहीं करता हूं।

लेकिन अपने प्रश्न का जवाब देने के लिए कोर:

#!/usr/bin/python 

import code 

f = open('input.txt', 'r') 

def readfunc(prompt): 
    return f.readline() 

code.interact(readfunc=readfunc) 

फिर चलने वाले एक टर्मिनल में:

$ ./test.py 
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
(InteractiveConsole) 

सूचना आपको एक संदेश मिलता नहीं मिलता है।

फिर एक और टर्मिनल समय में

:

echo "globals()" >> input.txt 

और पहली टर्मिनल में वापस आप उत्पादन देखेंगे।