python - पाइथन एप्लिकेशन के लिए सबसे अच्छी परियोजना संरचना क्या है?




directory-structure organization (6)

"पायथन पैकेजिंग अथॉरिटी" में नमूना प्रोजेक्ट है:

https://github.com/pypa/sampleproject

यह एक नमूना प्रोजेक्ट है जो पैकेजिंग और वितरण परियोजनाओं पर पायथन पैकेजिंग उपयोगकर्ता मार्गदर्शिका के ट्यूटोरियल की सहायता के रूप में मौजूद है।

कल्पना कीजिए कि आप पाइथन में एक गैर-मामूली अंत उपयोगकर्ता डेस्कटॉप (वेब ​​नहीं) अनुप्रयोग विकसित करना चाहते हैं। प्रोजेक्ट के फ़ोल्डर पदानुक्रम को ढूढ़ने का सबसे अच्छा तरीका क्या है?

वांछनीय विशेषताएं रखरखाव, आईडीई-मित्रता, स्रोत नियंत्रण शाखाओं / विलय के लिए उपयुक्तता, और स्थापित पैकेजों की आसान पीढ़ी के लिए उपयुक्त हैं।

विशेष रूप से:

  1. आप स्रोत कहां रखते हैं?
  2. आप एप्लिकेशन स्टार्टअप स्क्रिप्ट कहां डालते हैं?
  3. आप आईडीई परियोजना क्रूर कहां डालते हैं?
  4. आप यूनिट / स्वीकृति परीक्षण कहां डालते हैं?
  5. आप कॉन्फ़िगरेशन फ़ाइलों जैसे गैर-पायथन डेटा कहां डालते हैं?
  6. आप पीईडी / इतने बाइनरी एक्सटेंशन मॉड्यूल के लिए गैर-पायथन स्रोतों जैसे सी ++ कहां डालते हैं?

बहुत ज्यादा मायने रखता नहीं है। जो भी आपको खुश कर देगा वह काम करेगा। बहुत सारे मूर्ख नियम नहीं हैं क्योंकि पायथन परियोजनाएं सरल हो सकती हैं।

  • /scripts या /bin उस तरह के कमांड लाइन इंटरफेस सामान के लिए
  • /tests आपके परीक्षण के लिए परीक्षण
  • /lib आपके सी भाषा पुस्तकालयों के लिए /lib
  • अधिकांश दस्तावेज़ों के लिए /doc
  • एपीडोक-जेनरेट एपीआई दस्तावेज़ों के लिए /apidoc

और शीर्ष-स्तरीय निर्देशिका में रीडमे, कॉन्फ़िगर और व्हाट्नॉट हो सकता है।

कठिन विकल्प यह है कि एक /src पेड़ का उपयोग करना है या नहीं। पाइथन में जावा या सी जैसे /src , /lib , और /bin बीच अंतर नहीं है।

चूंकि कुछ शीर्ष-स्तर /src निर्देशिका को अर्थहीन के रूप में देखा जाता है, इसलिए आपकी शीर्ष-स्तरीय निर्देशिका आपके एप्लिकेशन का शीर्ष-स्तरीय आर्किटेक्चर हो सकती है।

  • /foo
  • /bar
  • /baz

मैं इसे "नाम-का-मेरा-उत्पाद" निर्देशिका के तहत डालने की अनुशंसा करता हूं। इसलिए, यदि आप quux नामक एक एप्लिकेशन लिख रहे हैं, तो निर्देशिका में यह सब सामान शामिल है /quux नाम दिया गया है।

फिर, एक अन्य प्रोजेक्ट के QUUX.foo , QUUX.foo मॉड्यूल का पुन: उपयोग करने के /path/to/quux/foo शामिल कर सकते हैं।

मेरे मामले में, चूंकि मैं कमोडो एडिट का उपयोग करता हूं, इसलिए मेरा आईडीई क्यूफ्ट एक एकल। केपीएफ फ़ाइल है। मैं वास्तव में इसे शीर्ष-स्तर /quux निर्देशिका में /quux , और इसे एसवीएन में जोड़ना छोड़ देता /quux



जीन-पॉल कैल्डरोन द्वारा इस ब्लॉग पोस्ट को आमतौर पर फ्रीनोड पर #python में एक उत्तर के रूप में दिया जाता है।

एक पायथन परियोजना की फाइल सिस्टम संरचना

कर:

  • अपनी परियोजना से संबंधित निर्देशिका का नाम दें। उदाहरण के लिए, यदि आपकी प्रोजेक्ट को "ट्विस्टेड" नाम दिया गया है, तो अपनी स्रोत फ़ाइलों के लिए शीर्ष-स्तरीय निर्देशिका का नाम दें। जब आप रिलीज़ करते हैं, तो आपको वर्जन नंबर प्रत्यय शामिल करना चाहिए: Twisted-2.5
  • यदि आपके पास कोई है तो एक निर्देशिका Twisted/bin बनाएं और अपने एक्जिक्यूटिव को वहां रखें। उन्हें एक .py एक्सटेंशन न दें, भले ही वे पाइथन स्रोत फाइलें हों। अपनी परियोजनाओं में कहीं और परिभाषित एक मुख्य समारोह के आयात को छोड़कर कॉल करने के अलावा उनमें कोई भी कोड न डालें। (थोड़ा झुर्रियाँ: चूंकि विंडोज़ पर, दुभाषिया फ़ाइल एक्सटेंशन द्वारा चुना जाता है, तो आपके विंडोज उपयोगकर्ता वास्तव में .py एक्सटेंशन चाहते हैं। इसलिए, जब आप विंडोज के लिए पैकेज करते हैं, तो आप इसे जोड़ना चाहेंगे। दुर्भाग्यवश कोई आसान डिस्ट्यूटल्स चाल नहीं है मुझे इस प्रक्रिया को स्वचालित करने के बारे में पता है। यह देखते हुए कि POSIX पर .py एक्सटेंशन केवल एक वार्ट है, जबकि विंडोज़ पर कमी एक वास्तविक बग है, यदि आपके उपयोगकर्ताबेस में विंडोज उपयोगकर्ता शामिल हैं, तो आप बस .py चुन सकते हैं हर जगह विस्तार।)
  • यदि आपकी परियोजना एक पाइथन स्रोत फ़ाइल के रूप में अभिव्यक्त है, तो इसे निर्देशिका में डालें और इसे अपने प्रोजेक्ट से संबंधित कुछ नाम दें। उदाहरण के लिए, Twisted/twisted.py । यदि आपको एकाधिक स्रोत फ़ाइलों की आवश्यकता है, तो इसके बजाय एक पैकेज बनाएं ( Twisted/twisted/ , खाली Twisted/twisted/__init__.py ) और अपनी स्रोत फ़ाइलों को इसमें रखें। उदाहरण के लिए, Twisted/twisted/internet.py . Twisted/twisted/internet.py
  • अपने यूनिट परीक्षण को अपने पैकेज के उप-पैकेज में रखें (नोट - इसका मतलब है कि उपरोक्त एकल पायथन स्रोत फ़ाइल विकल्प एक चाल था - आपको हमेशा अपने यूनिट परीक्षणों के लिए कम से कम एक अन्य फ़ाइल की आवश्यकता होती है)। उदाहरण के लिए, Twisted/twisted/test/ । बेशक, इसे Twisted/twisted/test/__init__.py साथ एक पैकेज Twisted/twisted/test/__init__.pyTwisted/twisted/test/test_internet.py जैसी फ़ाइलों में परीक्षण रखें।
  • यदि आप अच्छा महसूस कर रहे हैं, तो क्रमशः अपने सॉफ़्टवेयर को समझाने और इंस्टॉल करने के लिए Twisted/setup.py और Twisted/setup.py जोड़ें।

मत करो:

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

एक पायथन परियोजना को सही तरीके से सोर्सिंग खोलें देखें।

मुझे उस उत्कृष्ट लेख के प्रोजेक्ट लेआउट भाग को उद्धृत करने दें:

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

चलो शीर्ष पर शुरू करते हैं। अधिकांश परियोजनाओं में कई शीर्ष-स्तरीय फ़ाइलें होती हैं (जैसे setup.py, README.md, requirements.txt, आदि)। तब तीन निर्देशिकाएं हैं जिनके प्रत्येक प्रोजेक्ट में होना चाहिए:

  • परियोजना दस्तावेज युक्त एक दस्तावेज़ निर्देशिका
  • प्रोजेक्ट के नाम से नामित एक निर्देशिका जो वास्तविक पायथन पैकेज को संग्रहीत करती है
  • दो स्थानों में से एक में एक परीक्षण निर्देशिका
    • परीक्षण कोड और संसाधन युक्त पैकेज निर्देशिका के तहत
    • स्टैंड-अलोन टॉप लेवल डायरेक्टरी के रूप में आपकी फाइलों को व्यवस्थित करने के तरीके के बारे में बेहतर जानकारी प्राप्त करने के लिए, यहां मेरी परियोजनाओं में से एक के लिए लेआउट का सरलीकृत स्नैपशॉट है, सैंडमैन:
$ pwd
~/code/sandman
$ tree
.
|- LICENSE
|- README.md
|- TODO.md
|- docs
|   |-- conf.py
|   |-- generated
|   |-- index.rst
|   |-- installation.rst
|   |-- modules.rst
|   |-- quickstart.rst
|   |-- sandman.rst
|- requirements.txt
|- sandman
|   |-- __init__.py
|   |-- exception.py
|   |-- model.py
|   |-- sandman.py
|   |-- test
|       |-- models.py
|       |-- test_sandman.py
|- setup.py

जैसा कि आप देख सकते हैं, कुछ शीर्ष स्तर की फ़ाइलें हैं, एक दस्तावेज़ निर्देशिका (जेनरेट की गई एक खाली निर्देशिका है जहां स्पिंक्स जेनरेटेड प्रलेखन डालेगा), एक सैंडमैन निर्देशिका, और सैंडमैन के नीचे एक परीक्षण निर्देशिका।


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

  • आप स्रोत कहां रखते हैं?

    • बड़ी परियोजनाओं के लिए स्रोत को कई अंडों में विभाजित करना समझ में आता है। प्रत्येक अंडा PROJECT_ROOT/src/<egg_name> तहत एक अलग सेटअपtools-layout के रूप में जाना होगा।
  • आप एप्लिकेशन स्टार्टअप स्क्रिप्ट कहां डालते हैं?

    • आदर्श विकल्प है कि अंडे में से एक में entry_point रूप में पंजीकृत एप्लिकेशन स्टार्टअप स्क्रिप्ट है।
  • आप आईडीई परियोजना क्रूर कहां डालते हैं?

    • आईडीई पर निर्भर करता है। उनमें से कई अपनी सामग्री PROJECT_ROOT/.<something> परियोजना की जड़ में रखते हैं, और यह ठीक है।
  • आप यूनिट / स्वीकृति परीक्षण कहां डालते हैं?

    • प्रत्येक अंडे में परीक्षणों का एक अलग सेट होता है, जो इसके PROJECT_ROOT/src/<egg_name>/tests निर्देशिका में रखा जाता है। मैं व्यक्तिगत रूप से उन्हें चलाने के लिए py.test का उपयोग करना पसंद करता हूं।
  • आप कॉन्फ़िगरेशन फ़ाइलों जैसे गैर-पायथन डेटा कहां डालते हैं?

    • निर्भर करता है। गैर-पायथन डेटा के विभिन्न प्रकार हो सकते हैं।
      • "संसाधन" , यानी डेटा जो अंडे के भीतर पैक किया जाना चाहिए। यह डेटा संबंधित अंडा निर्देशिका में जाता है, कहीं पैकेज नामस्थान के भीतर। इसका उपयोग pkg_resources पैकेज के माध्यम से किया जा सकता है।
      • "कॉन्फ़िगर-फाइलें" , यानी गैर-पायथन फाइलें जिन्हें प्रोजेक्ट स्रोत फ़ाइलों के बाहरी के रूप में जाना जाता है, लेकिन एप्लिकेशन प्रारंभ होने पर कुछ मानों के साथ आरंभ किया जाना चाहिए। विकास के दौरान मैं ऐसी फाइलें PROJECT_ROOT/config में रखना पसंद करता हूं। तैनाती के लिए कई विकल्प हो सकते हैं। विंडोज़ पर लिनक्स पर %APP_DATA%/<app-name>/config , /etc/<app-name> या /opt/<app-name>/config
      • जेनरेट की गई फाइलें , यानी फाइलें जिन्हें निष्पादन के दौरान एप्लिकेशन द्वारा बनाया या संशोधित किया जा सकता है। मैं उन्हें विकास के दौरान PROJECT_ROOT/var में रखना चाहता हूं, और लिनक्स परिनियोजन के दौरान /var अंतर्गत।
  • आप पीईडी / इतने बाइनरी एक्सटेंशन मॉड्यूल के लिए गैर-पायथन स्रोतों जैसे सी ++ कहां डालते हैं?
    • PROJECT_ROOT/src/<egg_name>/native

दस्तावेज़ीकरण आमतौर पर PROJECT_ROOT/doc या PROJECT_ROOT/src/<egg_name>/doc (यह इस बात पर निर्भर करता है कि आप कुछ अंडों को अलग-अलग बड़ी परियोजनाओं के रूप में देखते हैं)। कुछ अतिरिक्त कॉन्फ़िगरेशन PROJECT_ROOT/buildout.cfg और PROJECT_ROOT/setup.cfg जैसी फ़ाइलों में PROJECT_ROOT/setup.cfg





project-structure