পাইথন নাক আমদানি ত্রুটি


121

আমি ফাইল কাঠামোর মধ্যে আমার টেস্ট স্ক্রিপ্টের নীচে মডিউলগুলি সনাক্ত করতে নাক পরীক্ষার কাঠামোটি পেতে পারি না । আমি সবচেয়ে সহজ উদাহরণ স্থাপন করেছি যা সমস্যাটি দেখায়। আমি এটি নীচে ব্যাখ্যা করব।

প্যাকেজ ফাইল গঠন এখানে:

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

foo.py রয়েছে:

def dumb_true():
    return True

টেস্ট / টেস্ট_ফু.পি এতে রয়েছে:

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)

আমি পরীক্ষাগুলি / ডিরেক্টরিটি ভিতরে রেখে যখন একই ত্রুটি পাই error ডকুমেন্টেশন এবং আমি যে উদাহরণটি পেয়েছি সে অনুসারে, নাকে সমস্ত অভিভাবক প্যাকেজগুলি সেই পথের পাশাপাশি যে ডিরেক্টরি থেকে বলা হয়েছিল তা যুক্ত করার কথা রয়েছে, তবে এটি আমার ক্ষেত্রে ঘটছে বলে মনে হয় না।

আমি পাইথন ২.6.২ সহ উবুন্টু ৮.০৪ চালাচ্ছি। আমি নাকটি ম্যানুয়ালি তৈরি এবং ইনস্টল করেছি (সেটআপ _ টুলসের সাথে নয়) যদি তা গুরুত্বপূর্ণ।

উত্তর:


226

আপনি __init__.pyআপনার শীর্ষ স্তরের ডিরেক্টরিতে একটি পেয়েছেন । এটি এটি একটি প্যাকেজ করে তোলে। আপনি যদি এটি সরিয়ে থাকেন তবে আপনার nosetestsকাজ করা উচিত।

আপনি এটি অপসারণ না থাকে, তাহলে আপনি আপনার পরিবর্তন করতে হবে importকরতে import dir.foo, যেখানে dirআপনার ডিরেক্টরির নাম।


7
এটা এটা পেয়েছে। অনেক ধন্যবাদ! আমি ভোট দিয়েছি, তবে স্পষ্টতই আমার আরও খ্যাতি দরকার।
হাফাক

4
কোন চিন্তা করো না. স্ট্যাকওভারফ্লোতে আপনাকে স্বাগতম! উত্তরটি যদি আপনার সমস্যার সমাধান করে তবে আপনি বামে সবুজ চেকমার্কটিকে টিক দিতে পারেন।
ire_and_curses

2
@ হাফফাক: আপনার প্রশ্নটিতে আবার একটি উত্সাহ দিন। আপনিও (আপনার উত্তরে), @
মার্ক রুশাকফ

1
বুঝেছি.
টিপটির

5
আমি একটি অবস্থা যেখানে পরীক্ষার কাজ যদি আছে Init রুট ডিরেক্টরি মধ্যে .py - তবে, আমি প্রয়োজন যে ফাইল সেখানে হতে, এবং আমদানি মডেলের <MODEL_NAME>। এখনও পাওয়া যায় না। পরীক্ষা একটি পরীক্ষা / ডিরেক্টরিতে থাকে এবং আমি যে মডেলটি পরীক্ষা করতে চাইছি সেটি হল মডেল / ডিরেক্টরির ভিতরে ... কোনও সাহায্যের প্রশংসা করা হবে।
কিস ব্রিগেস

32

আপনি কি একটি ভার্চুয়ালেনভে আছেন? আমার ক্ষেত্রে, nosetestsএক ছিল /usr/bin/nosetests, যা ব্যবহার করছিলেন /usr/bin/python। ভার্চুয়ালেনভের প্যাকেজগুলি অবশ্যই সিস্টেমের পথে হবে না। নিম্নলিখিত এটি স্থির করে:

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

2
আমারটাও. ধন্যবাদ, অনেক সময় বাঁচিয়েছি।
jskulki

3
আমার জন্য সিস্টেমে একটিকে nosetestsক্যাশে করা bashহয়েছিল /usr/local/bin( which nosetestsসঠিক ফলাফল দেওয়ার সময় )। আমি ব্যবহৃত এই এটা পরিষ্কার।
রাফি

5
অতিরিক্ত হিসাবে, আমার নিষ্ক্রিয় ও আমার ভার্চুয়ালেনভকে সক্রিয় করতে হয়েছিল।
বেনগেট

আমি সঙ্গে একটি সমস্যা ছিল : - PS1 = $ {PS1} যখন virtualenv (সেট না ভেরিয়েবল ত্রুটিগুলি পরাস্ত) সক্রিয় সেট। এটি মুছে ফেলার পরে এবং ++ সেট করে স্যুইচ করার পরে আমার আর কোনও সমস্যা হয়নি।
জুলুস ওহটনেন

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
@ আমান, আপনি ভেরিয়েবল আইডেন্টিফায়ার এবং ফাইলের নামের মধ্যে পার্থক্য বুঝতে পেরেছেন?
নাকিলন

হ্যাঁ ... আমার কাছে সবসময়ই এমন একটি ফাইল থাকে যা FooTests.py এর অনুরূপ ছিল এবং এটি কোনও কারণে এটি পছন্দ করে না ... আমি Foo_Tests.py নামকরণ করেছি এবং এটি কাজ করেছে ... কিছুটা চিকন লাগছে।
বার্ডম্যান

3

অবশ্যই আপনার যদি মডিউলটিতে একটি সিনট্যাক্স ত্রুটি আমদানি করা হচ্ছে যা এর কারণ হতে পারে। আমার জন্য সমস্যাটি তার মাথা বাড়িয়েছে যখন আমি একই ডিরেক্টরিতে টেস্ট.পি.পি. হিসাবে মডিউল / টেস্ট.বাক.পি এর মতো একটি পাথ সহ একটি পরীক্ষার ফাইলটির ব্যাকআপ রাখি। এছাড়াও, একটি জ্যাঙ্গো অ্যাপ্লিকেশনটিতে সূচনা প্যাকেজ / মডিউল সমস্যা মোকাবেলা করার জন্য , আপনার চারপাশে কোনও 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

এবং সম্ভবত আপনি এই প্রকল্পের বাইরের কোনও পথ থেকে পরীক্ষা চালাতে চান, আপনার পাইথনপথের মধ্যে আপনার প্রকল্পের পথ অন্তর্ভুক্ত করুন।

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

আপনার। প্রোফাইলের ভিতরে এটি আটকান। যদি আপনি ভার্চুয়াল পরিবেশের অধীনে থাকেন তবে এটি আপনার ভেনভ রুটে সক্রিয়করণের অভ্যন্তরে পেস্ট করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.