2011-03-04 16 views
8

मुझे अपनी पायथन परियोजना की संरचना में कुछ समस्याएं हैं। वर्तमान में यह एक ही फ़ोल्डर में फ़ाइलों का एक गुच्छा है। मैं की तरहटेस्ट और पायथन पैकेज संरचना

proj/ 
    __init__.py 
    foo.py 
    ... 
    bar/ 
    __init__.py 
    foobar.py 
    ... 
    tests/ 
    foo_test.py 
    foobar_test.py 
    ... 

समस्या यह है कि मैं नहीं पा रहा हूँ, भीतरी निर्देशिकाओं से है यह संरचना करने, बाहरी निर्देशिकाओं से मॉड्यूल आयात करने के लिए कोशिश की है। यह परीक्षणों के साथ विशेष रूप से परेशान है।

मैंने मुख्य मॉड्यूल से सापेक्ष आयात के बारे में सापेक्ष आयात और PEP 366 के बारे में PEP 328 पढ़ा है। लेकिन इन दोनों विधियों को आधार पैकेज को मेरे पायथनपैथ में होना आवश्यक है। दरअसल मैं निम्न त्रुटि प्राप्त

ValueError: Attempted relative import in non-package.

तो मैं परीक्षण फ़ाइलों

import os, sys 
sys.path.append(os.path.join(os.getcwd(), os.path.pardir)) 

फिर भी मैं एक ही त्रुटि मिलती है की चोटी पर निम्नलिखित बॉयलरप्लेट कोड गयी। क्या करने के लिए

  • संरचना एक पैकेज का सही तरीका, परीक्षण के साथ पूरा हो गया है, और
  • पथ आयात की अनुमति देने के लिए आधार निर्देशिका जोड़ सकता हूँ?

संपादित के रूप में टिप्पणी में अनुरोध किया है, मैं

import os, sys 
sys.path.append(os.path.join(os.getcwd(), os.path.pardir)) 
from ..foo import Foo 
+0

क्या आप एक उदाहरण आयात दिखा सकते हैं जो विफल रहता है? –

+0

इसके अलावा, कृपया अपने 'PythonPATH' –

+0

' echo $ PYTHONPATH 'के लिए मूल्य अभी अभी खाली है। – Andrea

उत्तर

12

जब आप -m रन कोड पर स्विच करते हैं, तो वर्तमान निर्देशिका sys.path पर जोड़ा जाता है। तो अपने परीक्षण चलाने के लिए सबसे आसान तरीका है proj की पेरेंट निर्देशिका से है, आदेश का उपयोग:

python -m proj.tests.foo_test 

कि काम करने के लिए, आप अपने परीक्षण निर्देशिका में एक __init__.py फ़ाइल शामिल करने के लिए इतना है कि परीक्षण सही ढंग से कर रहे हैं की आवश्यकता होगी पैकेज के हिस्से के रूप में मान्यता प्राप्त है।

+0

धन्यवाद! तो मैं जो खो रहा था वह था कि 'परीक्षण' खुद ही एक पैकेज होना चाहिए। यह एक बेवकूफ गलती थी, लेकिन मैं इसे समझ नहीं पाया। – Andrea

5

मैं जब भी संभव पूर्ण proj.NAME पैकेज उपसर्ग का उपयोग करके मॉड्यूल आयात करना चाहते (फ़ाइल foo_test.py में) एक उदाहरण के आयात कि विफल रहता है जोड़ें। यह दृष्टिकोण Google Python styleguide अनुशंसा करता है।

एक विकल्प आपको अपने पैकेज संरचना को रखने, पूर्ण पैकेज पथों का उपयोग करने और विकास के साथ आगे बढ़ने के लिए एक वर्चुअलएन्व का उपयोग करना होगा और अपनी परियोजना को विकास मोड में रखना होगा। develop कमांड प्राप्त करने के लिए आपके प्रोजेक्ट के setup.py को distutils के बजाय setuptools का उपयोग करने की आवश्यकता होगी। अब जब आप अपने virtualenv अपने PYTHONPATH के भीतर से python चलाने संकुल के सभी को इंगित करेंगे

from proj.foo import Foo 

:

% virtualenv ~/virt 
% . ~/virt/bin/activate 
(virt)~% cd ~/myproject 
(virt)~/myproject% python setup.py develop 
(virt)~/myproject% python tests/foo_test.py 

foo_test.py कहाँ उपयोग करता है:

यह आपको ऊपर sys.path.append सामग्री से बचने दूँगी आपकी परियोजना में आप हर बार . ~/virt/bin/activate टाइप किए बिना अपना वर्चुअलनव दर्ज करने के लिए एक छोटा खोल उपनाम बना सकते हैं।

+0

यह दिलचस्प लगता है। मुझे इस वर्चुअलएनवी उपकरण की जांच करनी होगी। क्या यह मुझे वर्चुअल वातावरण में काम करने की इजाजत देता है जहां मुझे पैकेज के रूप में वर्तमान डीआईआर तक पहुंच मिल सकती है? या यह बस एक पृथक पायथन वितरण के साथ एक उपकरण है - एक क्रोट की तरह - जहां मुझे इसे इस्तेमाल करने से पहले हर बार अपना पैकेज स्थापित करना होगा? – Andrea

+0

यह एक पृथक पायथन पर्यावरण बनाने का एक त्वरित तरीका है जिसे आप दूर उड़ सकते हैं और जल्दी से फिर से बना सकते हैं। अपने सिस्टम पायथन को प्रदूषित किए बिना पाइप/easy_install का उपयोग करके मॉड्यूल को आजमाने के लिए अच्छा है। वर्चुअलएनवी 'सक्रिय' स्क्रिप्ट आपके 'पथ 'के सामने' ~/virt/bin' dir को प्रविष्ट करती है ताकि सिस्टम पायथन से पहले ~/virt/bin/python' पाया जा सके। 'Develop' कमांड' .pth' फ़ाइल का उपयोग करके आपके प्रोजेक्ट के संकुल को '~/virt/lib/pythonx.x/site-packages 'में लिंक करता है। यह आपको 'PS1' प्रॉम्प्ट को यह भी बताने के लिए संशोधित करता है कि आप वर्चुअलएन्व के अंदर "अंदर" हैं। – samplebias

+0

अच्छी सलाह, हालांकि इन दिनों आप 'setuptools 'के लिए अधिक सक्रिय रूप से बनाए रखा विकल्प के रूप में' वितरण 'चुनना चाहेंगे। – ncoghlan

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