2009-08-27 17 views
9

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

eulerproject/ 
    __init__.py 
    euler1.py 
    euler2.py 
    ... 
    eulern.py 
    tests/ 
    __init__.py 
    testeulern.py 

यहाँ testeuler12.py की सामग्रियों (पहले टेस्ट मॉड्यूल मैं लिखा है) कर रहे हैं:: यहाँ निर्देशिका सेटअप है

import unittest 
from .. import euler12 

class Euler12UnitTests(unittest.TestCase): 


    def testtriangle(self): 
     """ 
     Ensure that the triangle number generator returns the first 10 
     triangle numbers. 

     """ 
     self.seq = [1,3,6,10,15,21,28,36,45,55] 
     self.generator = euler12.trianglegenerator() 
     self.results = [] 
     while len(self.results) != 10: 
      self.results.append(self.generator.next()) 
     self.assertEqual(self.seq, self.results) 

    def testdivisors(self): 
     """ 
     Ensure that the divisors function can properly factor the number 28. 

     """ 
     self.number = 28 
     self.answer = [1,2,4,7,14,28] 
     self.assertEqual(self.answer, euler12.divisors(self.number)) 


if __name__ == '__main__': 

    unittest.main() 

अब, जब मैं निष्क्रिय से और आदेश से इस पर अमल लाइन जबकि निर्देशिका में, मैं निम्नलिखित त्रुटि मिलती है:

Traceback (most recent call last): 
    File "C:\Documents and Settings\jbennet\My Documents\Python\eulerproject\tests\testeuler12.py", line 2, in <module> 
    from .. import euler12 
ValueError: Attempted relative import in non-package 

मुझे लगता है कि समस्या यह है कि जब से मैं इसे सीधे चल रहा हूँ, मैं रिश्तेदार आयात क्योंकि __name__ परिवर्तन नहीं कर सकते (और मेरे अस्पष्ट है संकुल विवरण की समझ यह है कि __name__ यह बताता है कि यह किस पैकेज में है), लेकिन उस मामले में आप लोगों को सुझाव देते हैं कि परीक्षण कोड से 1 स्तर ऊपर 'उत्पादन' कोड कैसे आयात किया जाए?

+0

कर सकते हैं बस का चयन यह और कोड नमूना बटन पर क्लिक करें। या इसे ' –

उत्तर

8

आम तौर पर आपके पास एक निर्देशिका होगी, जिसका नाम आपका पैकेज नाम है, कहीं आपके पायथनपैथ पर। उदाहरण के लिए:

eulerproject/ 
    euler/ 
     __init__.py 
     euler1.py 
     ... 
     tests/ 
      ... 
    setup.py 

फिर, आप इस प्रणाली में स्थापित करें, या जब अपनी स्क्रिप्ट लागू PYTHONPATH=/path/to/eulerproject/:$PYTHONPATH तैयार करना न भूलें या तो कर सकते हैं।

इस तरह एक निरपेक्ष आयात तो काम करेगा:

from euler import euler1 

संपादित:

अजगर डॉक्स के अनुसार, "एक अजगर आवेदन हमेशा का उपयोग करना चाहिए के मुख्य मॉड्यूल के रूप में उपयोग के लिए मॉड्यूल पूर्ण आयात। " (Cite)

तो अन्य उत्तर द्वारा वर्णित nose जैसे परीक्षण दोहन, काम करता है क्योंकि यह कमांड लाइन से उन्हें चलाने के बजाए पैकेज आयात करता है।

आप हाथ से काम करने के लिए चाहते हैं, अपने runnable स्क्रिप्ट, पैकेज पदानुक्रम के बाहर होने की जरूरत है इस तरह:

eulerproject/ 
    runtests.py 
    euler/ 
     __init__.py 
     euler1.py 
     ... 
     tests/ 
      __init__.py 
      testeulern.py 

अब, runtests.pyfrom euler.tests.testeulern import TestCase कर सकते हैं और testeulern.pyfrom .. import euler1

+2

हाँ, लेकिन फिर आपकी परियोजना अब रिश्तेदार आयात का लाभ नहीं लेती है। सापेक्ष आयात के बारे में अच्छी बात यह है कि यह आपके पैकेज को स्वयं निहित बनाता है।यह इसके मुख्य फ़ोल्डर नाम पर निर्भर नहीं है और यह एक यूनिट को गलत तरीके से आयात नहीं कर सकता है, उदाहरण के लिए, पैकेज का एक अप्रचलित संस्करण, जिसे PythonPATH में कहीं दफनाया गया है। –

+0

ठीक है, तो मैं स्क्रिप्ट का आह्वान करने से पहले पायथनपैट कैसे सेट करूं? जैसे कि मैं इसे एक ही कंप्यूटर पर दो अलग-अलग स्थानों से चलाने में सक्षम होना चाहता था? ps: मैं सीख रहा हूं कि क्लोनिंग/मर्किंग के साथ विलय करने के तरीके को कैसे संभालना है, यही कारण है कि यह दो स्थानों पर है। – Jonathanb

+0

पैकेज पदानुक्रम के बाहर स्थित स्क्रिप्ट से मॉड्यूल आयात होने पर रिश्तेदार आयात कैसे काम कर सकते हैं इस पर एक नोट जोड़ा गया। अन्यथा एक परीक्षण दोहन का उपयोग करें। पर्यावरण चर सेट करना आप जो काम कर रहे हैं उस पर निर्भर करता है। यदि आप बैश का उपयोग कर रहे हैं, तो बस PYTHONPATH = foo python scriptname.py –

10

मुझे एक ही समस्या थी। अब मैं अपने परीक्षण चलाने के लिए nose का उपयोग करता हूं, और सापेक्ष आयात सही ढंग से संभाले जाते हैं।

हाँ, यह संपूर्ण सापेक्ष आयात वस्तु भ्रमित है।

+2

में लपेटें, मैं दूसरे जवाब को स्वीकार कर रहा हूं क्योंकि यह मुझे ऐसा करने देता है जो मैं सापेक्ष आयात के साथ करने की कोशिश कर रहा हूं। हालांकि, मैं अपने परीक्षण दोहन के रूप में उपयोग करने के लिए नाक भी डाउनलोड कर रहा हूं क्योंकि यह किसी भी चीज़ से कहीं अधिक शक्तिशाली दिखता है जो मैं अपने आप पर जोड़ सकता हूं। – Jonathanb

+0

जो मैं खोज रहा था, धन्यवाद – Copperfield

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