पायथन नाक आयात त्रुटि


121

मैं फ़ाइल संरचना में मेरे परीक्षण स्क्रिप्ट के नीचे मॉड्यूल को पहचानने के लिए नाक परीक्षण रूपरेखा प्राप्त करने के लिए प्रतीत नहीं कर सकता । मैंने सबसे सरल उदाहरण स्थापित किया है जो समस्या को प्रदर्शित करता है। मैं इसे नीचे समझाता हूँ।

यहाँ पैकेज फ़ाइल संरचना है:

./__init__.py
./foo.py
./tests
   ./__init__.py
   ./test_foo.py

foo.py शामिल हैं:

def dumb_true():
    return True

परीक्षण / test_foo.py होता है:

import foo

def test_foo():
    assert foo.dumb_true()

दोनों init .py फाइलें खाली हैं

अगर मैं nosetests -vvमुख्य निर्देशिका में भागता हूं (जहां foo.py है), मुझे मिलता है:

Failure: ImportError (No module named foo) ... ERROR

======================================================================
ERROR: Failure: ImportError (No module named foo)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/loader.py", line 379, in loadTestsFromName
    addr.filename, addr.module)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 39, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/usr/lib/python/site-packages/nose-0.11.1-py2.6.egg/nose/importer.py", line 86, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/home/user/nose_testing/tests/test_foo.py", line 1, in <module>
    import foo
ImportError: No module named foo

----------------------------------------------------------------------
Ran 1 test in 0.002s

FAILED (errors=1)

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

मैं प्यूथन 2.6.2 के साथ उबंटू 8.04 चला रहा हूं। अगर मैंने उस मामले में मैन्युअल रूप से (सेटअप_टूल के साथ नहीं) नाक बनाया और स्थापित किया है।

जवाबों:


226

आपको __init__.pyअपने शीर्ष स्तर की निर्देशिका में मिला है । जो इसे एक पैकेज बनाता है। यदि आप इसे हटाते हैं, तो आपका nosetestsकाम करना चाहिए।

आप उसे निकाल नहीं है, तो आप अपने बदलना होगा importकरने के लिए import dir.fooहै, जहां dirआपके निर्देशिका का नाम है।


7
जो मिल गया। बहुत धन्यवाद! मैं मतदान करूंगा, लेकिन जाहिर तौर पर मुझे अधिक प्रतिष्ठा की आवश्यकता है।
अर्ध

4
कोई चिंता नहीं। StackOverflow में आपका स्वागत है! यदि आपकी समस्या हल हो जाती है, तो आप हरे चेकमार्क को बाईं ओर टिक कर सकते हैं।
ire_and_curses

2
@ छलनी: अपने सवाल पर फिर से एक और upvote है। आप भी (अपने जवाब पर), @ire
मार्क रुशखॉफ

1
समझ गया। टिप के लिए धन्यवाद :)
आधा

5
मेरे पास एक ऐसी स्थिति है जहां परीक्षण काम करते हैं यदि जड़ निर्देशिका में init .py है - हालांकि, मुझे उस फ़ाइल की आवश्यकता है, और मॉडल आयात करें। <model_name> अभी भी नहीं मिला है। परीक्षण एक परीक्षण / निर्देशिका के अंदर है , और मैं जिस मॉडल का परीक्षण करने की कोशिश कर रहा हूं वह मॉडल / निर्देशिका के अंदर है ... किसी भी मदद की सराहना की जाएगी।
कीस ब्रिग्स

32

क्या आप एक virtualenv में हैं? मेरे मामले में, nosetestsवह एक /usr/bin/nosetestsथा जो उपयोग कर रहा था /usr/bin/python। Virtualenv में संकुल निश्चित रूप से सिस्टम पथ में नहीं होगा। निम्नलिखित ने यह तय किया:

source myvirtualenv/activate
pip install nose
which nosetests
/home/me/myvirtualenv/bin/nosetests

2
मेरा भी। धन्यवाद, बहुत समय बचा लिया।
21 अक्टूबर को jskulski

3
मेरे लिए सिस्टम nosetestsद्वारा bashएक में कैश किया गया था /usr/local/bin(जबकि which nosetestsउचित परिणाम दे रहा था)। मैं प्रयोग किया जाता है इस यह स्पष्ट करने के लिए।
राफी

5
इसके अतिरिक्त, मुझे अपने virtualenv को निष्क्रिय और सक्रिय करना पड़ा।
Bengt

मुझे Virtual1v को सक्रिय करते समय (unset चर पर त्रुटियों को दूर करने के लिए ) सेट किया गया था PS1 = $ {PS1: -} के साथ एक समस्या थी । इसे हटाने और सेट + यू पर स्विच करने के बाद , मुझे अब कोई समस्या नहीं थी।
जुसो ओह्टनन

13

यदि आप बाद में इस प्रश्न को पाते हैं, तो मुझे आयात त्रुटि मिलती है यदि मेरे पास नहीं है __init__.py मेरी परीक्षण निर्देशिका में फ़ाइल ।

मेरी निर्देशिका संरचना इस प्रकार थी:

./tests/
  ./test_some_random_stuff.py

अगर मैं नोसेटेस्ट भाग गया:

nosetests -w tests

यह देना होगा ImportErrorकि हर कोई देख रहा है। यदि मैं एक रिक्त __init__.pyफ़ाइल जोड़ता हूँ तो यह ठीक काम करती है:

./tests/
  ./__init__.py
  ./test_some_random_stuff.py

10

एक और संभावित समस्या निर्देशिका ट्री में हाइफ़न / डैश है। मैंने हाल ही में एक निर्देशिका का नाम बदलकर एक नाक आयात आयात मुद्दा तय किया sub-dirहै sub_dir



1
@Aman, आपको चर पहचानकर्ताओं और फ़ाइल नामों के बीच अंतर का एहसास है?
नकीलोन

हाँ ... मेरे पास हमेशा एक फ़ाइल होती है जो FooTests.py के समान थी और यह किसी कारण से इसे पसंद नहीं करती थी ... मैंने Foo_Tests.py का नाम बदल दिया और यह काम किया ... थोड़ा कठिन लगता है।
बर्डमैन

3

बेशक अगर आपको आयात किए जा रहे मॉड्यूल में एक सिंटैक्स त्रुटि है जो इसका कारण होगा। मेरे लिए यह समस्या तब बढ़ गई जब मेरे पास एक परीक्षण फ़ाइल थी, जिसमें उसी निर्देशिका में मॉड्यूल / test.bak.py जैसे पथ के साथ एक परीक्षण फ़ाइल का बैकअप था। इसके अलावा, एक Django एप्लिकेशन में init पैकेज / मॉड्यूल समस्या से निपटने के लिए , आप निम्नलिखित (एक bash / OSX शेल में) यह सुनिश्चित करने के लिए चला सकते हैं कि आपके पास कोई init नहीं है .pyc चारों ओर झूठ बोल रही फ़ाइलें:

find . -name '*.pyc' -delete

3

मुझे यह त्रुटि संदेश मिला क्योंकि मैं चलाता हूं nosetests गलत निर्देशिका से कमांड ।

मूर्ख, लेकिन होता है।


क्या आप कृपया अपने उत्तर में कुछ विवरण जोड़ सकते हैं? आपने इसे किस निर्देशिका से चलाया? यह गलत क्यों है? सही निर्देशिका क्या होगी? nosetestsकिसी भी परीक्षण के बिना एक निर्देशिका में चलाने के परिणामस्वरूप Ran 0 tests, कोई आयात त्रुटि नहीं होगी । अपने वर्तमान रूप में यह उत्तर उपयोगी नहीं है।
जेरिट

2

मैं सिर्फ एक और चीज़ में भाग गया, जो इस समस्या का कारण हो सकता है: प्रपत्र में परीक्षणों का नामकरण testname.test.py। यह अतिरिक्त .नाक को भ्रमित करता है और इसे उन चीजों का आयात करता है जो इसे नहीं करना चाहिए। मुझे लगता है कि यह स्पष्ट हो सकता है कि अपरंपरागत परीक्षण के नामकरण सम्मेलनों का उपयोग करने से चीजें टूट जाएंगी, लेकिन मुझे लगा कि यह ध्यान देने योग्य हो सकता है।


2

उदाहरण के लिए, निम्नलिखित निर्देशिका संरचना के साथ, आप चलाना चाहते हैं nosetestsमें m1, m2या m3में कुछ कार्यों का परीक्षण करने n.pyके लिए, आप का उपयोग करना चाहिए from m2.m3 import nमें test.py

m1
└── m2
    ├── __init__.py
    └── m3
        ├── __init__.py
        ├── n.py
        └── test
            └── test.py

1

बस सवाल पूरा करने के लिए: यदि आप इस तरह की संरचना से जूझ रहे हैं:

project
├── m1
    ├── __init__.py
    ├── foo1.py
    └──m2
       ├── __init__.py
       └── foo2.py

└── test
     ├── __init__.py
     └── test.py

और हो सकता है कि आप प्रोजेक्ट के बाहर किसी पथ से परीक्षण चलाना चाहते हों, अपने प्रोजेक्ट पथ को अपने PYTHONPATH के अंदर शामिल करें।

export PYTHONPATH=$PYTHONPATH:$HOME/path/to/project

इसे अपने .profile के अंदर चिपकाएँ। यदि आप एक आभासी वातावरण में हैं, तो इसे अपने वेनव रूट में सक्रिय करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.