2011-03-24 12 views
5

में कोड का पुनर्मूल्यांकन करता है। मैं प्री-मौजूदा पिलोन प्रोजेक्ट (ओकेएफएन के सीकन) पर पायथन में प्रोग्रामिंग कर रहा हूं, लेकिन मैं व्यापार से लिस्पर हूं और चीजों को करने के तरीके से उपयोग करता हूं।पायलॉन आरईपीएल चल रहे वेब सर्वर

कृपया मुझे सही कर अगर मैं झूठे बयान करते हैं:

तोरणों में यह है कि मैं कहना चाहिए

$ paster की सेवा --reload

एक वेब सर्वर है कि परिवर्तन देखेंगे प्राप्त करने के लिए लगता है।

उस बिंदु पर मैं एक फ़ंक्शन बदल सकता हूं, फ़ाइल को सहेज सकता हूं और फिर परिवर्तन का परीक्षण करने के लिए अपने ब्राउज़र पर जा सकता हूं।

यदि मैं वेबपृष्ठ बनाने की प्रक्रिया में किसी फ़ंक्शन में चर की जांच करना चाहता हूं, तो मैं "हैलो" उठाता हूं, और फिर जब मैं पृष्ठ लोड करता हूं, तो मुझे ब्राउज़र आधारित डीबगर मिलता है, जिसमें मैं जांच कर सकता हूं कार्यक्रम।

यह सब बहुत अच्छा है और तैराकी से काम करता है, और मुझे लगता है कि लोग इस प्रकार पिलोन कोड लिखते हैं।

दुर्भाग्य से पुनः लोड में कई सेकंड लगते हैं, और यह मेरी सोच की ट्रेन को तोड़ता रहता है।

मैं क्या करना चाहता हूं कि वेब सर्वर को emacs से चलाने के लिए है, (हालांकि कमांड लाइन पर एक अजगर आरईपीएल लगभग उतना ही अच्छा होगा), ताकि मैं संपादक में एक फ़ंक्शन बदल सकूं और फिर भेजूं चलने की प्रक्रिया के बिना नया कोड इसे पुनरारंभ किए बिना। (एक कमांड लाइन प्रतिलिपि के साथ मुझे लगता है कि मुझे नई चीज की प्रतिलिपि बनाना और पेस्ट करना होगा, लेकिन यह भी काम करने योग्य होगा, थोड़ा कम सुविधाजनक)

पायथन बहुत गतिशील प्रतीत होता है, और कई तरीकों से लिस्प की तरह, मैं किसी भी कारण से सिद्धांत में नहीं देख सकता कि यह क्यों काम नहीं करेगा।

तो मुझे लगता है कि सवाल यह है:

किसी को भी काम करने के तुतलाना तरह से परिचित है, और Pylons साथ, और वे मुझे बताओ कि तोरणों में तुतलाना तरह से कार्यक्रम कर सकते हैं? या किसी कारण से यह असंभव या बुरा विचार है?

संपादित करें:

मैं साथ Emacs अंदर मेरे अजगर दुभाषिया से वेबसर्वर चला सकते हैं:

from paste.script.serve import ServeCommand 
ServeCommand("serve").run(["development.ini"]) 

और मैं डालने से रोकने के लिए और मुझे दिखाने के लिए यह क्या कर रहा है कोड प्राप्त कर सकते हैं:

import pdb 
pdb.set_trace() 

तो अब मुझे बस एक अलग थ्रेड पर चलाने के लिए वेबसर्वर प्राप्त करने का एक तरीका है, ताकि नियंत्रण आरईपीएल पर वापस आ जाए और मैं चल रही प्रक्रिया में कार्यों और चर को फिर से परिभाषित कर सकता हूं।

def start_server(): 
    from paste.script.serve import ServeCommand 
    ServeCommand("serve").run(["development.ini"]) 


server_thread=threading.Thread(target=start_server) 
server_thread.start() 

यह काम करने के लिए, सिवाय इसके कि अगर मैं आरईपीएल में आयोजित एक समारोह को फिर से परिभाषित परिवर्तन वेबसर्वर में परिलक्षित नहीं हो रहा है। क्या किसी को पता है क्यों?

+0

"परिवर्तन वेबसर्वर में दिखाई नहीं देता है। क्या किसी को पता है क्यों?" मुद्दा यह है कि ऑब्जेक्ट्स पुराने कोड के साथ पहले से ही बनाए गए हैं। कक्षा परिभाषा को बदलना मौजूदा वस्तुओं पर '__class__' (या' func_code' या जो कुछ भी) गुणों को अभिभावित नहीं करता है। यही कारण है कि पूरी प्रक्रिया को फिर से लोड करना आम तौर पर आसान होता है। – SingleNegationElimination

+0

धन्यवाद। यह एक शोस्टॉपर की तरह दिखता है। मैं हार दूंगा ओह ठीक है ... मुझे लगता है कि मैं तब तक इंतजार करूंगा जब तक कि मेरा कंप्यूटर तेज़ी से न हो जाए ... –

उत्तर

1

ऐसा लगता है कि टोकन मैकगुय की टिप्पणी द्वारा दिए गए कारण के लिए काम करने का यह तरीका पाइथन में असंभव है, यानी क्योंकि कक्षा को फिर से परिभाषित करने से उस वर्ग के उदाहरण में कोड नहीं बदलता है।

यह एक भयानक शर्म की बात है, क्योंकि कई अन्य मामलों में अजगर बहुत लचीला लगता है, लेकिन यह समझाता है कि क्यों कोई पाइथन-झटका नहीं है!

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

  • कोई संबंधित समस्या नहीं^_^