2011-08-24 11 views
8

मूल रूप से मेरे पास एक पैकेज में मेरे सभी मॉड्यूल थे। मैंने हाल ही में मूल पैकेज में एक सब-पैकेज बनाया है, और इसमें कुछ मॉड्यूल ले जाया गया है। मेरा स्रोत फ़ोल्डर, और 2 पैकेज फ़ोल्डर्स, मेरे सभी PythonPATH में हैं।

चूंकि मैंने उन मॉड्यूल को स्थानांतरित कर दिया है, इसलिए जो बदलाव मैं अपनी .py फ़ाइलों में कर रहा हूं, वे जेनरेट की गई * $ py.class फ़ाइलों में अपना रास्ता नहीं बना रहे हैं, जो मुझे विश्वास है कि आखिरकार क्या चल रहा है, आधारित print __FILE__ पर क्या थूकता है।

.class फ़ाइलें शीर्ष-स्तरीय पैकेज की निर्देशिका में स्थित हैं, जो मुझे विश्वास है क्योंकि वे पहले स्थान से आयात किए गए मॉड्यूल के भीतर उस पैकेज में हैं। तो मुझे लगता है कि वे सही जगह पर हैं।

मॉड्यूल को शीर्ष-स्तर पैकेज में वापस ले जाने से समस्या दूर हो जाती है, लेकिन एक पैकेज में सभी मॉड्यूल होने के लिए मजबूर होना मुश्किल है। क्या मुझे पैकेज के हिस्से के रूप में मॉड्यूल को 'रजिस्टर' करने के लिए कुछ करना है, इसे __init__.py वाले फ़ोल्डर में रखने के अलावा?

नोट: बाकी प्रश्न केवल उन लक्षणों के कारण हैं जिनसे मुझे यह निष्कर्ष निकाला गया है कि जब मैं .py फ़ाइलों को बदलता हूं तो क्लास फ़ाइलों को अद्यतन नहीं किया जा रहा है। यदि आप एक टीएल हैं, तो आप शायद इसे छोड़ सकते हैं; पी

मैंने फ़ंक्शन की शुरुआत में व्हाइटस्पेस का एक गुच्छा लगाया, और जब मैं इसे चलाता हूं, तो कर्सर निम्नानुसार उपयोग करता है होने के लिए।

यहाँ कोड आईडीई मुझे पता चलता है:

enter image description here

और यहां स्थानीय वार्स हैं (ध्यान दें कि self कुछ भी नहीं के लिए बाध्य किया गया है):

enter image description here

मैं एक कदम के बाद लाइनों की कुछ, यहां कोड है (कर्सर की स्थिति नोट करें): enter image description here और स्थानीय:

enter image description here

सूचना है कि अब selfid और updatePeriod बाध्य किया गया है, इसलिए उन पहले 2 खाली स्थान के बाद कोड की लाइनों स्पष्ट रूप से निष्पादित किया गया है।

अगर मैं पूरी तरह से .py फ़ाइल को हटा देता हूं (इसे डेस्कटॉप या किसी चीज़ पर चिपकाएं), तो जाहिर है कि आईडीई इसे नहीं ढूंढ पा रहा है, इसलिए मैं इसके माध्यम से कदम नहीं उठा सकता, लेकिन प्रोग्राम किस कोड का उपयोग करता है होने के लिए (कुछ स्पष्ट परिवर्तन हैं जिन्हें मैं बता सकता हूं प्रभाव में नहीं हैं)।

अंत में, प्रासंगिक * $ py.class फाइलों पर संशोधन दिनांक 4.5 घंटे पुराने हैं, यह सब नगण्य के बावजूद मैं पिछले एक घंटे से अधिक हाल .py फ़ाइलों या 2.

उत्तर

4

साथ कर रहा हूँ संकलित पाइथन फ़ाइलों को स्वचालित रूप से हटाया नहीं जाता है, जब .py हटा दिया जाता है। चूंकि वे आपके उप-पैकेज से पहले $PYTHONPATH में हैं, इसलिए उन्हें निष्पादित किया गया है, और चूंकि उनके पास .py नहीं है, इसलिए वे उपयोग किए जाएंगे और उन्हें कभी अपडेट नहीं किया जाएगा। एकमात्र समाधान उन्हें मैन्युअल रूप से निकालना है।

पीडीडीव वास्तव में स्रोत की व्याख्या करके, भ्रम में जोड़ता है।

+0

हम्म। मैंने पहले प्रासंगिक क्लास फाइलों को हटाने का प्रयास किया था, लेकिन मुझे चीजों को खोजने में सक्षम नहीं होने के बारे में त्रुटियां मिलीं। मैंने बस कक्षा फ़ाइलों के * सभी * को हटाने का प्रयास किया, और यह ठीक करने लग रहा था। धन्यवाद! –

1

मुझे लगता है कि यहाँ 2 मुद्दे हैं:

  • जब आप फ़ाइल को ले जाते हैं, $py.class पुनर्जीवित नहीं कर रहा है:

ऐसा इसलिए है क्योंकि आप मुख्य प्रवेश के रूप में फ़ाइल चला रहे है ... अगर मुझे ठीक से याद है, तो $py.class केवल तभी उत्पन्न होता है जब फ़ाइल आयात हो जाती है (यानी: आपके __main__ मॉड्यूल के लिए नहीं) और केवल तभी कोड बदल दिया गया है (मुझे यकीन नहीं है कि ज्योथन का निर्णय कैसे बदला गया था - शायद फ़ाइल का समय, लेकिन मैं यहां गलत हो सकता हूं)।

उस के लिए सबसे अच्छा समाधान $ py.class को हटा देगा जब आप एक फ़ाइल और उसके संबंधित $ py.class (जैसे फ़ोल्डर को स्थानांतरित करना) ले जाते हैं, इस तरह आप 100% सुनिश्चित कर सकते हैं कि ज्योथन इसे कभी नहीं उठाएगा ।

PyDev आपकी मदद कर सकता है: PyDev Package Explorer > PyDev > Remove *.pyc, *.pyo and *$py.class Files में एक फ़ोल्डर का चयन करें। इसी .py फ़ाइल के बिना

  • $py.class फ़ाइलों

PyDev वास्तव में .pyc फ़ाइलों के लिए ठीक से इस संभालती है (अर्थात .: .pyc को हटा देता है जब .py फ़ाइल अब उपलब्ध नहीं है)। मैं पीडीडीव को $py.class फाइलों के लिए संभालने के लिए बदल रहा हूं (इसलिए, यदि आप 3-4 घंटे के भीतर रात को प्राप्त करते हैं, तो यह काम करना चाहिए - देखें: http://pydev.org/download.html इसे प्राप्त करने के निर्देशों के लिए - तब तक, आप हटा सकते हैं ऊपर वर्णित मैन्युअल रूप से)।

+0

दरअसल नहीं, जिन फ़ाइलों को मैंने स्थानांतरित किया था, वे सभी कहीं से आयात किए जा रहे थे। उनमें से कोई भी मुख्य प्रविष्टि नहीं था। मुझे लगता है कि @vartec सही है कि शीर्ष स्तर के पैकेज में बैठे पुराने वर्ग की फाइलों का सामना पहले किया जा रहा था, और इसलिए इस्तेमाल किया जा रहा था, बजाय गहरी और स्रोत फ़ाइलों को ढूंढने के बजाय, जिन्हें पुनः संयोजित किया जाना था। हालांकि पैकेज एक्सप्लोरर टिप बहुत उपयोगी है, धन्यवाद! और यह सुनना अच्छा है कि एक फिक्स अगले निर्माण में जा रहा है :) –

1

मेरे यहां एक ही प्रश्न था, और मैंने कुछ परीक्षण किए।
मुझे पता है कि यह विषय थोडा पुराना है, लेकिन फिर भी मैं यहां कुछ जोड़ना चाहता हूं।

$py.class फ़ाइलों को केवल जब .py class कहीं आयात किया जा रहा है निर्माण और अद्यतन करने के लिए हो जाता है। यदि .py फ़ाइल execfile() के साथ निष्पादित की जा रही है तो $py.class फ़ाइल बनाई गई या अपडेट नहीं की गई है।