2016-03-08 7 views
7

तो मेरे पास यह अजगर चीज है जिसे फ़ाइल को संसाधित करने की आवश्यकता है।एक अजगर परियोजना की संरचना के लिए एक बहुत ही सरल * तरीका क्या है?

पहले यह था:

my_project/ 
├── script.py 

और मैं बस python script.py file.csv के साथ भाग जाता है।

तो यह बड़ा हुआ और बन गया:

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

(हर निर्देशिका में एक खाली __init__.py है)

लेकिन अबmy_service.pystring_util.py उपयोग करना चाहते हैं और यह बहुत है यह अच्छी तरह से करने के लिए सीधा नहीं है।

मैं my_service.py (जो from services import my_service साथ script.py में आयात किया जाता) में from ..util import string_util करना चाहते हैं, लेकिन उस के बाद से my_service के __name__python script.py साथ काम नहीं करता तो केवल services.my_service है (और मैं मिल Attempted relative import beyond toplevel package)

  • मैं क्या कर सकते हैं cd .. और python -m my_project.script, लेकिन यह इतना अप्राकृतिक लगता है और इसे चलाने के निर्देशों के लिए इसे रीडमे में डालने में वाकई बुरा होगा।

  • अभी मैं बदसूरत sys.path.append() हैक के साथ इसे हल कर रहा हूं।

मेरे पास अन्य विकल्प क्या हैं?

+0

मैं इस पर अपना हिस्सा साझा कर सकता हूं, लेकिन इसे उत्तर के रूप में पोस्ट किया जाएगा। मुझे पता है कि आप क्या सोचते हैं। – idjaw

उत्तर

2

यह राय पर सीमा है, लेकिन मैं इस पर अपना हिस्सा साझा करूंगा।

आपको अपनी परियोजना को एक अलग तरीके से देखना चाहिए। आप एक निष्पादन बिंदु चुनें, और वहां से अपने आयात का संदर्भ लें, उन सभी अजीब सापेक्ष आयातों से बचने के लिए जो आप काम करने की कोशिश कर रहे हैं। तो, अपनी परियोजना संरचना को देख:

my_project/ 
├── script.py 
├── util/ 
│ └── string_util.py 
├── services/ 
│ └── my_service.py 

आप वर्तमान में क्या कर रहे हैं के रूप में, my_project के भीतर से अपने कोड निष्पादित। इस तरह आपके सभी आयात उस बिंदु के संबंध में होना चाहिए। इसलिए, अपने आयात वास्तव में इस तरह दिखेगा:

# my_service.py 

from util.string_util import foo 

एक और तरीका है इस बारे में सोचने की, कि यदि आप अपनी परियोजना के चारों ओर आगे बढ़ रहे हैं, या एक सीआई है, तो आप यकीन है कि आप इस परियोजना जड़ है क्या निर्दिष्ट करने की जरूरत है है आप से निष्पादित करना चाहते हैं। इन चीजों को ध्यान में रखते हुए, और आपके प्रोजेक्ट को निष्पादित करने के एकल निष्पादन बिंदु को निर्दिष्ट करते हुए, आपके पैकेज और मॉड्यूल को संरचित करने और उचित रूप से संदर्भित करने से निपटने के लिए आपके जीवन को अधिक आसान बना दिया जाएगा, जिससे अन्य सिस्टम आपके प्रोजेक्ट का सही तरीके से उपयोग कर सकते हैं। अजीब रिश्तेदार आयात से निपटने के बिना।

उम्मीद है कि इससे मदद मिलती है।

+0

वाह, यह वास्तव में मेरे लिए बिल्कुल नहीं हुआ था। और यह बहुत आसान है। तो मैं '..util आयात string_util' से' ..' को हटा सकता हूं और सबकुछ शांत है। (अगर मैं यहां पूर्ण आयात के साथ अच्छा हूं, जो मैं हूं।) यह निश्चित रूप से मदद करता है। धन्यवाद! – Bloke

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