পাইথনে "ইম্পোর্টেরিয়ার: কোনও মডিউল নামকরণ করা হয়নি ..." ত্রুটিটি কীভাবে ঠিক করবেন?


114

এই আমদানি ত্রুটিটি ঠিক করার সঠিক উপায় কী?

আমার নিম্নলিখিত ডিরেক্টরি কাঠামো রয়েছে:

/home/bodacydo
/home/bodacydo/work
/home/bodacydo/work/project
/home/bodacydo/work/project/programs
/home/bodacydo/work/project/foo

এবং আমি ডিরেক্টরিতে আছি

/home/bodacydo/work/project

এখন যদি আমি টাইপ করি

python ./programs/my_python_program.py

আমি সঙ্গে সঙ্গে পেতে

ImportError: No module named foo.tasks

./programs/my_python_program.pyনিম্নলিখিত লাইন রয়েছে:

from foo.tasks import my_function

অজগর কেন পাবে না তা আমি বুঝতে পারি না ./foo/tasks.py- এটি আছে।

যদি আমি পাইথন শেল থেকে এটি করি তবে এটি কাজ করে:

python
>>> from foo.tasks import my_function

আমি python ./programs/my_python_program.pyস্ক্রিপ্টের মাধ্যমে কল করলে এটি কেবল কাজ করে না ।

উত্তর:


119

পাইথন বর্তমান ডিরেক্টরির যোগ না sys.path, বরং যে ডিরেক্টরি স্ক্রিপ্ট রয়েছে। যোগ /home/bodacydo/work/projectউভয় sys.pathবা $PYTHONPATH


9
তাহলে রুট ফোল্ডারে init .py থাকার পরে কী লাভ ? আপনি sys.path বা পাইথনপথটি সম্পাদনা করলে কোনও উদ্দেশ্য হয় না বলে মনে হয়।

11
@ সম্পাদক: __init__.pyকেবল নির্দেশটি নির্দেশ করে যে ডিরেক্টরিটি প্যাকেজ হিসাবে বিবেচনা করা উচিত, যখন তার পিতামাতা হয় sys.pathনিজেই প্যাকেজে থাকে in
Ignacio Vazquez-Abram

3
এছাড়াও ফোল্ডারে অনুমতিগুলি পরীক্ষা করুন। আমার ক্ষেত্রে এটাই সমস্যা ছিল।
সিডজে

15
অজগর পথে বর্তমান দির যোগ করতে, ব্যবহার করুনexport PYTHONPATH=`pwd`
রডর্গোস

1
আমার পক্ষে যা কাজ করেছিল তা ছিল $ পাইথনপথকে প্রকল্পের মূল ডিরেক্টরিতে যুক্ত করা, আপনার ক্ষেত্রে এটি হবে: /home/bodacydo/work... এই উত্তরটি দেখুন
maledr53

33

__init__.pyFoo ডিরেক্টরিতে আপনার কাছে কোনও ফাইল বলা আছে? তা না হলে পাইথন পাইকে অজগর প্যাকেজ হিসাবে চিনতে পারে না।

আরও তথ্যের জন্য পাইথন টিউটোরিয়ালের প্যাকেজগুলির বিভাগটি দেখুন ।


ধন্যবাদ এবং হ্যাঁ, আমি ছিলাম __init__.py। এবার সমস্যাটি ছিল $PYTHONPATH। Ignacio এর সমাধান কাজ করে।
বোডাসিদো

1
Init .py ফাইল পাইথন যেমন প্যাকেজ ধারণকারী ডিরেক্টরি আচরণ করতে প্রয়োজন বোধ করা হয়; স্ট্রিংয়ের মতো একটি সাধারণ নাম সহ ডিরেক্টরিগুলি অনিচ্ছাকৃতভাবে মডিউল অনুসন্ধানের পথে পরে আসা বৈধ মডিউলগুলি আড়াল করা থেকে করা যায়। সর্বাধিক সহজ ক্ষেত্রে, init .py কেবল একটি খালি ফাইল হতে পারে
প্যানোফিশ

আমাকে মাঝে মাঝে বাঁচানোর জন্য ধন্যবাদ
সিপিইউ_মেলটাডাউন

9

এখানে ধাপে ধাপে সমাধান:

  1. একটি স্ক্রিপ্ট নামক যোগ করুন run.pyমধ্যে /home/bodacydo/work/projectভালো এবং এটি সম্পাদনা:

    import programs.my_python_program
    programs.my_python_program.main()
    

    ( main()আপনার সমতুল্য পদ্ধতিটি প্রতিস্থাপন করুন my_python_program))

  2. যাও /home/bodacydo/work/project
  3. চালান run.py

ব্যাখ্যা: যেহেতু পাইথন পাইথনপথে স্ক্রিপ্টের যে পথ থেকে এটি চলবে run.pyতার যে পথটি চলবে , চলমান সংযোজন করবে /home/bodacydo/work/project। এবং voilà , import foo.tasksপাওয়া যাবে।


8

আপনার পাইথনপথে লাইব্রেরি যুক্ত করার উদাহরণ সমাধান।

  1. আপনার ~ / .bashrc এ নিম্নলিখিত লাইনটি যুক্ত করুন বা কেবল এটি সরাসরি চালান:

    export PYTHONPATH="$PYTHONPATH:$HOME/.python"
  2. তারপরে আপনার প্রয়োজনীয় লাইব্রেরিটি আপনার ~ / .python ফোল্ডারে লিঙ্ক করুন, যেমন

    ln -s /home/user/work/project/foo ~/.python/

6

সেটিংয়ের চেয়ে আরও ভাল ফিক্সটি PYTHONPATHব্যবহার করাpython -m module.path

এটি সঠিকভাবে সেট হয়ে যাবে sys.path[0]এবং মডিউলগুলি কার্যকর করার আরও নির্ভরযোগ্য উপায়।

আমি একটি আছে দ্রুত কাজের মধ্যে থাকবেন এই সমস্যাটি সম্পর্কে, যেমন অন্যান্য answerers উল্লেখ করেছি কারণ এই জন্য python path/to/file.pyরাখে path/toশুরুতে উপর PYTHONPATH( sys.path)।


2

মনে মনে আমাকে বিবেচনা করতে হবে যে fooফোল্ডারটি একটি একা লাইব্রেরি। আমি এটিকে Lib\site-packagesপাইগন ইনস্টলেশনগুলির মধ্যে ফোল্ডারে স্থানান্তরিত করার বিষয়ে বিবেচনা করতে চাই । আমি foo.pthসেখানে কোনও ফাইল যুক্ত করার বিষয়টি বিবেচনা করতে চাই ।

আমি জানি এটি একটি লাইব্রেরি যেহেতু ./programs/my_python_program.pyনিম্নলিখিত লাইনটি রয়েছে:

from foo.tasks import my_function

সুতরাং এটি কোনও ./programsভাইবোন ফোল্ডারের সাথে গুরুত্বপূর্ণ নয় ./foo। এটি সত্য যে এটি এর my_python_program.pyমতো স্ক্রিপ্ট হিসাবে চালিত হয়:

অজগর। / প্রোগ্রাম / মাই_পিথন_প্রগ্রাম.পি


0

ইনস্টলড সংস্করণ ব্যবহার করার সময় আপনার যদি এই সমস্যা হয়, ব্যবহার করার সময় setup.py, নিশ্চিত করুন যে আপনার মডিউলটি ভিতরে অন্তর্ভুক্ত রয়েছেpackages

setup(name='Your program',
    version='0.7.0',
    description='Your desccription',
    packages=['foo', 'foo.bar'], # add `foo.bar` here
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.