2015-08-21 7 views
5

मान लें कि आपके पास निंजा नामक एक बड़ी (पायथन) सॉफ्टवेयर प्रोजेक्ट है। प्रोजेक्ट के कई हिस्सों जैसे सर्वर और क्लाइंट, लेकिन एक सामान्य आधारभूत संरचना लाइब्रेरी भी है, जिसमें सामान्य वर्ग और उपकरण शामिल हैं। स्वाभाविक रूप से मैं इस तरह एक पैकेज संरचना बनाने होगा: ninja.core, ninja.server और ninja.client, जहां दोनों सर्वर और किसी तरह से ग्राहक आयात ninja.core। विकास प्रयोजनों के लिए कोर, सर्वर और ग्राहक विभिन्न परियोजनाओं में रखा जाता है (हम सबवर्सन साथ ग्रहण का उपयोग करें), इस प्रकार इस तरह एक फ़ोल्डर संरचना में जिसके परिणामस्वरूप:विभिन्न परियोजनाओं के पाइथन पुस्तकालय एक ही पैकेज में कैसे हो सकते हैं?

eclipse_workspace 
| 
>-Ninja_core 
| | 
| >-ninja 
| | 
| >-core 
| 
>-Ninja_client 
| | 
| >-ninja 
| | 
| >-client 
. 
. 
. 

एक जावा पृष्ठभूमि मैं ग्रहण करने के बाद यह संभव होगा, लेकिन यह निकला (पढ़ना: आयात त्रुटियां) कि यह काम नहीं करता है। के रूप में this answer में बताया, यह आम तौर पर करने के लिए संभव नहीं है ninja.core और ninja.clientजब तक दोनों वे एक ही पैकेज ninja, जो वे नहीं कर रहे हैं की सबपैकेज हैं।

दृष्टिकोण एक::

  • एक भी ग्रहण/SVN परियोजना में पूरे कोड रखो और केवल एक ही पैकेज ninja है अनुसार सबपैकेज साथ इस को जन्म देता है।

उत्पादन परिवेश में हम कोर और सर्वर नहीं बल्कि ग्राहक या कोर और ग्राहक स्थापित करने के लिए सक्षम होना चाहते हैं लेकिन नहीं सर्वर। मुझे गलती हो सकती है, लेकिन जहां तक ​​मैं पाइथन पैकेज को समझता हूं, यह दृष्टिकोण ए के साथ संभव नहीं होगा। परियोजनाओं को अलग लेकिन संगत रखना, यह ninja_core, ninja_client और ninja_server नामों के साथ पैकेज का उपयोग करने के लिए उपयोगी प्रतीत होता है, जो इसमें करता है वास्तव में आयात की समस्याओं को हल करें और विकास सेटअप में सब कुछ सुचारू रूप से चल रहा है।

दृष्टिकोण बी:: स्वतंत्र रूप से सर्वर स्थापित करने के लिए और ग्राहक में सक्षम होने की आवश्यकता को पूरा करने के लिए, मैं करने के विचार के साथ आया था

  • निंजा नामक एक नया प्रोजेक्ट बनाएं जो पैकेज ninja
  • __init__.pyninja अन्य पुस्तकालयों (यदि स्थापित है) आयात करें, तो वे ninja

मुझे अब तक काम करने के लिए यह नहीं मिला है और मुझे लगता है कि यह संभव भी संभव नहीं है।मैं इस तरह कुछ सोच रहा था:

# __init__.py of ninja 
import ninja_core as core 
# or this: 
from ninja_core import core 
# or this: 
import ninja_core.core 

मैंने इन्हें आजमाया और आयात त्रुटियों को फिर से प्राप्त कर लिया। पाइथन पैकेज को गठबंधन करने और मेरी समस्या से संबंधित कुछ भी नहीं ढूंढने के तरीकों के लिए googling के बाद मैं यहाँ आया था।

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

tl; डॉ

मैं निंजा पुस्तकालय जहां एक उपयोगकर्ता import ninja.client और import ninja.server ऐसा करने में सक्षम होना चाहिए विकासशील कर रहा हूँ। क्लाइंट और सर्वर अलग से पुस्तकालयों को स्थापित करना संभव है। यह कैसे प्राप्त करता है?

उत्तर

3

बशर्ते आप शीर्ष-स्तरीय नेमस्पेस ninja खाली छोड़ दें, यह पहले से ही पाइथन 3.3 और बाद में समर्थित है, PEP 420 देखें; तुम सब करने की है ninja निर्देशिका बनाने और कि निर्देशिका में __init__.py फ़ाइल बाहर छोड़:

eclipse_workspace 
| 
>-Ninja_core 
| | 
| >-ninja 
| | 
| >-core 
|  | 
|  >-__init__.py 
| 
>-Ninja_client 
| | 
| >-ninja 
| | 
| >-client 
|  | 
|  >-__init__.py 

ninja निर्देशिका बच्चे core और client निर्देशिका से अलग खाली रहते हैं। उन निर्देशिकाओं __init__.py फ़ाइलें हैं।

पहले पायथन संस्करणों में, आप setuptools namespace packages का उपयोग करके नामस्थानों के लिए समर्थन जोड़ सकते हैं। ज़ोप और प्लोन परियोजनाएं अब वर्षों से setuptools का उपयोग करके नामित पैकेज जारी कर रही हैं।

मूलभूत सिद्धांत यह है कि आप सुनिश्चित करते हैं कि आपकी परियोजनाएं setup.py फ़ाइल के साथ पैकेज हैं, और या तो development mode या अंतिम उत्पादों के रूप में स्थापित हैं। आपका ninja निर्देशिका करना तो एक __init__.py फ़ाइल है, लेकिन इन केवल निम्न पंक्ति शामिल होना चाहिए:

setup(
    # ... 
    namespace_packages = ['ninja'] 
) 
+0

यह काम करता है:

__import__('pkg_resources').declare_namespace(__name__) 

और प्रत्येक परियोजना के लिए setup.py फ़ाइल नाम स्थान घोषित करना चाहिए , लेकिन चूंकि 'निंजा' फ़ोल्डर में '__init __ नहीं है। py' ग्रहण किसी सबफ़ोल्डर को पैकेज होने के लिए नहीं पहचानता है। क्या इसके लिए कोई विकल्प या आसान फिक्स है? – nfs

+0

क्षमा करें, कोई विचार नहीं; मैं ग्रहण या PyDev खुद का उपयोग नहीं करता; एक त्वरित Google दिखाता है कि दूसरों ने इसके बारे में शिकायत की है लेकिन मुझे आपके लिए कोई आसान समाधान नहीं दिख रहा है। –

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

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