2016-08-17 7 views
5

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

वैकल्पिक रूप से, कर सकते हैं मैं इसे एक निश्चित तरीके से क्रैश करता हूं (सामान्य Ctrl-c कीबोर्ड इंटरप्ट के अलावा) जैसे कि दुर्घटना के पल में चर मूल्यों को कहीं भी चिपकाया जाता है क्योंकि मैंने अपनी स्क्रिप्ट में इसके लिए योजना नहीं बनाई है? (मैं उबंटू, पायथन 2.7 चला रहा हूं और स्क्रिप्ट बस टर्मिनल से 'पायथन test.py' द्वारा चलाया जाता है)

+0

नोट - भविष्य में * हमेशा * 'logging' मॉड्यूल बनाम प्रिंट बयान का उपयोग करें। यदि आप उस आदत में आते हैं, तो आप हमेशा डेटा छोड़ देंगे। यदि आप उस बिंदु पर पहुंच जाते हैं जहां आपको वास्तव में परवाह नहीं है, तो आप लॉगिंग स्तर को बंद कर सकते हैं ताकि यह केवल चेतावनी/अपवाद संदेश दिखाए (या कुछ भी नहीं)। –

+0

@WayneWerner टिप के लिए बहुत बहुत धन्यवाद, वास्तव में आप बिल्कुल सही हैं। मैं अभी बहुत दुखी और मूर्ख महसूस कर रहा हूं ... –

उत्तर

6

आपके प्रोग्राम को संपादित किए बिना, आपको एक बुरा समय होगा। जो आप खोज रहे हैं वह रिमोट डीबगर का कुछ रूप है, लेकिन कुछ भी जो आपको पाइथन विशिष्ट चीजें देता है, शायद कम से कम किसी भी तरह से आपके प्रोग्राम में एक हुक दिया जाना चाहिए। ऐसा कहा जा रहा है, अगर आप एक ढेर में चारों ओर झुकाव महसूस करते हैं, तो आप अपने प्रोग्राम (gdb -p <PID>) में जीडीबी संलग्न कर सकते हैं और देख सकते हैं कि आप क्या पा सकते हैं।

संपादित करें: ठीक है। यह वास्तव में संभव हो सकता है।

here, GDB के लिए अजगर एक्सटेंशन स्थापित है, अगर आप gdb python <PID> के साथ एक gdb खोल खोलने पॉप, आप py-print <name of the variable> चलाने के लिए अपने मूल्य प्राप्त करने में सक्षम होना चाहिए, यह सोचते हैं कि यह उस बिंदु पर कार्यक्रम के दायरे में है के बाद। इस अपने आप को तुच्छ कार्यक्रम से कोई लेना देना, प्रयास कर रहा है

import time 
a = 10 
time.sleep(1000) 

मैं, कार्यक्रम (ps aux | grep python) की पीआईडी ​​का पता लगाकर एक GDB खोल खोलने के लिए sudo gdb python <PID> चल रहा है और उसके बाद चलाने py-print a है, जो "वैश्विक 'एक का उत्पादन कर रहा था '= 10 "। बेशक यह मानता है कि आप * निक्स पर्यावरण में चल रहे हैं।

थोड़ी देर के लिए जीडीबी खोल में घूमते हुए, मैंने पाया कि आप वास्तव में पाइथन प्राइमेटिव्स के साथ बातचीत कर सकते हैं। एक सूचकांक

(gdb) python-interative 
>>> frame = Frame.get_selected_python_frame() 
>>> pyop_frame = frame.get_pyop() 
>>> var, scope = pyop_frame.get_var_by_name('<variable name>') 
>>> print(var.field('ob_size')) 

नोट आवश्यकता बातें (सूची के वास्तविक मूल्यों को प्राप्त करने के लिए वास्तविक आंतरिक क्षेत्र का नाम का उपयोग करने के लिए 'ob_item' के साथ पाया जा सकता है, और उसके बाद: उदाहरण के लिए, एक सरणी की लंबाई प्राप्त करने के लिए)।

आप एक समान तरीके से एक फाइल करने के लिए सरणी डंप कर सकते हैं:

length = int(str(var.field('ob_size')) 
output = [] 
for i in range(length): 
    output.append(str(var[i])) 
with open('dump', 'w') as f: 
    f.write(', '.join(output)) 
+0

मुझे जीडीबी विचार पसंद है, धन्यवाद। क्या आप मुझे कुछ रस्सी दे सकते हैं कि मैं एक निश्चित चर का उपयोग करने के लिए जीडीबी का उपयोग कैसे कर सकता हूं? (एक डमी उदाहरण में तो मैं विचार देख सकता हूं) –

+0

@ user929304 यह समस्या है। अपने प्रोग्राम में विशिष्ट हुक जोड़ने के बिना, मेमोरी मैप के बिट्स के बारे में कोई जानकारी जो चर के प्रभावी ढंग से खो जाती है। जीडीबी आपको स्मृति की डंप देगा जो आपको सबसे अच्छा करने में सक्षम होगा। – Sinkingpoint

+0

@ user929304 मैं गलत था! संपादन देखें। – Sinkingpoint

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