2011-04-14 22 views
6

चलाते समय उप-पैकेज पर आयात त्रुटि, मैं एक पायथन परियोजना के लिए एक इंस्टॉलेशन पैकेज बनाने के लिए एक इंस्टॉलेशन पैकेज बनाने की कोशिश कर रहा हूं जिसमें यूनिट परीक्षण शामिल हैं। मेरे परियोजना लेआउट इस प्रकार है:setup.py test

setup.py 
src/ 
    disttest/ 
     __init__.py 
     core.py 
tests/ 
    disttest/ 
     __init__.py 
     testcore.py 

मेरे setup.py इस तरह दिखता है:

from distutils.core import setup 
import setuptools 

setup(name='disttest', 
     version='0.1', 
     package_dir={'': 'src'}, 
     packages=setuptools.find_packages('src'), 
     test_suite='nose.collector', 
     tests_require=['Nose'], 
    ) 

फ़ाइल tests/disttest/testcore.py लाइन from disttest.core import DistTestCore शामिल हैं।

setup.py test चल रहा है अब ImportError: No module named core देता है।

setup.py install के बाद, python -c "from disttest.core import DistTestCore" ठीक काम करता है। यह भी काम करता है अगर मैंने import coresrc/disttest/__init__.py में रखा है, लेकिन मैं वास्तव में इसे बनाए रखना नहीं चाहता हूं और यह केवल परीक्षणों के लिए आवश्यक लगता है।

वह क्यों है? और इसे ठीक करने का सही तरीका क्या है?

+1

मुझे आश्चर्य है: क्या यह शायद setup.py test' से पहले 'setup.py install' करने का सामान्य अभ्यास है? [Setuptools प्रलेखन] (http://peak.telecommunity.com/DevCenter/setuptools#test) लगता है जैसे यह मामला नहीं है, मेरे स्रोतों को स्वचालित रूप से 'sys.path' पर रखा जाना चाहिए। शायद 'nose.collector' को मेरी' package_dir' आधार निर्देशिका के बारे में पता नहीं है? –

+0

आप testcore.py में कोर कैसे आयात कर रहे हैं? आपके sys.path/PythonPATH में वास्तव में क्या है? – Almad

उत्तर

1

आप इस बात की दोबारा जांच करने के लिए चाहते हो सकता है, लेकिन ऐसा लगता है अपने परीक्षण के बजाय src/ निर्देशिका से पैकेज-अंडर-परीक्षण के tests/ निर्देशिका में disttest पैकेज आयात कर रहे हैं, जैसे।

पैकेज-अंडर-टेस्ट के समान नाम के साथ आपको पैकेज का उपयोग करने की आवश्यकता क्यों है? मैं टेस्टकोर मॉड्यूल को परीक्षण निर्देशिका में ले जाउंगा, या tests/disttest पैकेज का नाम बदलूंगा और संभावित नामकरण संघर्ष को पूरी तरह से टालना चाहूंगा।

किसी भी मामले में, तुम बस में नाकाम रहने के आयात करने से पहले एक import pdb; pdb.set_trace() लाइन डालने और देखने के लिए क्या जहां से आयात किया जा रहा है (import sys; sys.modules['modulename'].__file__ अपने दोस्त है) अलग आयात बयान के साथ चारों ओर खेलना चाहते हैं तो आप क्या बारे में बेहतर जानकारी मिल गलत हो रहा।

+0

मुझे लगता है कि आपकी धारणा बिल्कुल सही है। जिस तरह से 'setup.py test' ने मेरे परीक्षण लॉन्च किए हैं, यह शायद 'sys.path' में' src/disttest/'के सामने' परीक्षण/disttest /' रखता है और पाइथन एक साथ नाम के साथ 'विलय' पैकेज नहीं करता है। बस 'परीक्षण/disttest/'' परीक्षण/disttest2' के लिए नामांकन (केवल परीक्षण उद्देश्यों के लिए, जाहिर है) इस मुद्दे को हल करता है। मुझे यह जांचना होगा कि अन्य परियोजनाएं यह कैसे करती हैं और सर्वोत्तम प्रथाएं यहां क्या हैं, क्योंकि एक ही निर्देशिका में सभी परीक्षण मॉड्यूल होने के कारण बड़ी परियोजनाओं का विकल्प नहीं है। डिबगिंग युक्तियों के लिए धन्यवाद! –

+0

मुझे नुकसान हो रहा है क्यों 'src/disttest/__ init __। Py' को' test/disttest/__ init __। Py' से पहले निष्पादित किया जाता है। (मैं पुष्टि की है कि उन्हें प्रिंट बयान जोड़कर।) मैं यह अपेक्षा की होगी दूसरी तरह के आसपास होने के लिए (या संभवतः 'src/disttest/__ init __।, सब पर निष्पादित किया जा रहा नहीं py' क्योंकि सभी उसे वैसे ही आयात' आयात परीक्षण/disttest/'), लेकिन वह उत्सुकता से बाहर था और अब मैं अपनी समस्या का समाधान कर सकता हूं। –

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