ModuleNotFoundError: এর অর্থ কী __main__ প্যাকেজ নয়?


207

আমি কনসোল থেকে একটি মডিউল চালানোর চেষ্টা করছি। আমার ডিরেক্টরিটির গঠনটি হ'ল:

এখানে চিত্র বর্ণনা লিখুন

আমি মডিউল চালানোর চেষ্টা করছি p_03_using_bisection_search.py, থেকে problem_set_02ডিরেক্টরির ব্যবহার করছে:

$ python3 p_03_using_bisection_search.py

ভিতরে কোডটি p_03_using_bisection_search.pyহল:

__author__ = 'm'


from .p_02_paying_debt_off_in_a_year import compute_balance_after


def compute_bounds(balance: float,
                   annual_interest_rate: float) -> (float, float):

    # there is code here, but I have omitted it to save space
    pass


def compute_lowest_payment(balance: float,
                           annual_interest_rate: float) -> float:

    # there is code here, but I have omitted it to save space
    pass    

def main():
    balance = eval(input('Enter the initial balance: '))
    annual_interest_rate = eval(input('Enter the annual interest rate: '))

    lowest_payment = compute_lowest_payment(balance, annual_interest_rate)
    print('Lowest Payment: ' + str(lowest_payment))


if __name__ == '__main__':
    main()

আমি এমন একটি ফাংশন আমদানি করছি p_02_paying_debt_off_in_a_year.pyযা কোডটিতে রয়েছে:

__author__ = 'm'


def compute_balance(balance: float,
                    fixed_payment: float,
                    annual_interest_rate: float) -> float:

    # this is code that has been omitted
    pass


def compute_balance_after(balance: float,
                          fixed_payment: float,
                          annual_interest_rate: float,
                          months: int=12) -> float:

    # Omitted code
    pass


def compute_fixed_monthly_payment(balance: float,
                                  annual_interest_rate: float) -> float:

    # omitted code
    pass


def main():
    balance = eval(input('Enter the initial balance: '))
    annual_interest_rate = eval(
        input('Enter the annual interest rate as a decimal: '))
    lowest_payment = compute_fixed_monthly_payment(balance,
                                                   annual_interest_rate)
    print('Lowest Payment: ' + str(lowest_payment))


if __name__ == '__main__':
    main()

আমি নিম্নলিখিত ত্রুটি পাচ্ছি:

ModuleNotFoundError: No module named '__main__.p_02_paying_debt_off_in_a_year'; '__main__' is not a package

এই সমস্যাটি কীভাবে সমাধান করা যায় তা সম্পর্কে আমার কোনও ধারণা নেই। আমি একটি __init__.pyফাইল যুক্ত করার চেষ্টা করেছি , তবে এটি এখনও কাজ করছে না।


3
আপনার সমস্যা নয়, তবে আমি কেবল এটি এখানে ফেলে দিতে চেয়েছিলাম: eval(input...সম্ভবত এটি দুর্দান্ত ধারণা নয়। আমি স্বেচ্ছাসেবীর কোড কার্যকর করার সুযোগ খোলার পরিবর্তে কেবল এটি পার্স করব।
কারসিজেনিকেট

2
আমি বাজি চাই যে eval(input(...বিটটি 2to3 দ্বারা প্রস্তাবিত হয়েছিল। আমি আজ আমার সাথে এটি করতে ছিল। খুশি আমি এর পরামর্শগুলিকে অন্ধ করে অনুসরণ করি না
ckot

উত্তর:


237

কেবল আপেক্ষিক আমদানির জন্য বিন্দুটি সরান এবং করুন:

from p_02_paying_debt_off_in_a_year import compute_balance_after

56
আপনি এটি সমাধান করুন। আমি যোগ করলেও আপেক্ষিক আমদানি কেন কাজ করছে না __init__.py?
lmiguelvargasf

23
গৃহীত উত্তরটি আমার পক্ষে কাজ করছে না। আপনি সম্ভবত একটি সংক্ষিপ্ত উদাহরণ সেটআপ যোগ করে উত্তরটি প্রসারিত করতে পারবেন?
প্রণাসাস

13
এটি আমার জন্য কাজ করে (প্যাকেজের অভ্যন্তরে, অর্থাত্ __init__.pyএকই ফোল্ডারে খালি ), যদিও আমার পাইচার্ম (2018.2.4) এটিকে "অমীমাংসিত রেফারেন্স" হিসাবে চিহ্নিত করে এবং আমদানিটি স্বতঃপূরণ করতে ব্যর্থ।
djvg

33
@ ডিজেভিজি - পাইচর্ম সংশোধন করতে আপনি রুট ডিরেক্টরিটিকে উত্সরূপ হিসাবে চিহ্নিত করতে পারেন
ডেনিস

12
পাইথনের আমদানি নিয়ে কাজ করা বিপর্যয়কর। এটি পাইথন 3, পাইচার্ম এবং মাইপাইয়ের মতো আমাদের ব্যয় নিয়ে এক বিশাল হাসি। এটি কীভাবে from ..sibling_pkg.nephew import my_functionপাইচার্মের জন্য বৈধ, তবে ফলাফলটি ValueError: attempted relative import beyond top-level packageএবং মাইপাই Cannot find module named '.sibling_pkg.nephew'( একটিতে নোট করুন "।" ত্রুটিতে দুটি নয়)। তবুও, from sibling_pkg.nephew import my_functionইচ্ছাকৃত হিসাবে কাজ করে, মাইপাই ত্রুটি নেই, তবে পাইচর্ম ত্রুটির ফলস্বরূপ।
ubiquibacon

85

আপনার মত আমারও একই সমস্যা আছে। আমি মনে করি যে আপনি আপেক্ষিক আমদানি ব্যবহার করে তা হল in-package import__init__.pyআপনার ডিরেক্টরিতে কোন নেই । উপরে মোশি যেমন উত্তর দিয়েছেন ঠিক তেমন আমদানি করুন

আমি মনে করি মূল সমস্যাটি হ'ল আপনি যখন কোনও বিন্দু দিয়ে আমদানি করবেন:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

এটি সমান:

from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after

যেখানে __main__আপনার বর্তমান মডিউল বোঝায় p_03_using_bisection_search.py


সংক্ষেপে, দোভাষী আপনার ডিরেক্টরি আর্কিটেকচারটি জানেন না।

দোভাষী যখন ভিতরে যান p_03.py, স্ক্রিপ্ট সমান:

from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after

এবং p_03_using_bisection_searchকোনও মডিউল বা ডাকা দৃষ্টান্তগুলি ধারণ করে না p_02_paying_debt_off_in_a_year


সুতরাং আমি পাইথন পরিবেশের মূল্যবান জিনিসগুলি ( আপেক্ষিক আমদানিতে অনুরোধগুলি কীভাবে কী করে তা দেখার পরে) পরিবর্তন না করেই একটি ক্লিনার সমাধান নিয়ে এসেছি :

ডিরেক্টরিটির মূল স্থাপত্যটি হ'ল:

main.py

setup.py

---problem_set_02/

------__init__.py

------p01.py

------p02.py

------p03.py

তারপরে লিখুন __init__.py:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

এখানে __main__হয় __init__এটা ঠিক মডিউল উল্লেখ করে, problem_set_02

তারপরে যান main.py:

import problem_set_02

আপনি setup.pyপরিবেশে নির্দিষ্ট মডিউল যুক্ত করতে একটি লিখতে পারেন ।



2

হাই দয়া করে নীচের পদক্ষেপটি অনুসরণ করুন, আপনি এই সমস্যার সমাধান করবেন। আপনি যদি ডিরেক্টরি এবং উপ-ডিরেক্টরি তৈরি করে থাকেন তবে নীচের পদক্ষেপগুলি অনুসরণ করুন এবং দয়া করে মনে রাখবেন সমস্ত ডিরেক্টরি অবশ্যই __init__.pyএটি ডিরেক্টরি হিসাবে স্বীকৃত হবে।

  1. import sysএবং দৌড়াতে sys.path, আপনি অজগর দ্বারা অনুসন্ধান করা সমস্ত পাথ দেখতে সক্ষম হবেন You আপনি অবশ্যই আপনার বর্তমান কার্য ডিরেক্টরিটি দেখতে সক্ষম হবেন।

  2. এখন আপনি আমদানি ব্যবহার করে সাব-ডিরেক্টরি এবং সংশ্লিষ্ট মডিউলটি আমদানি করুন এই আদেশটি অনুসরণ করুন: import subdir.subdir.modulename as abcএবং এখন আপনি সেই মডিউলটিতে পদ্ধতিগুলি ব্যবহার করতে পারেন। ScreenShotforSameIssue

যেমন আপনি এই স্ক্রিনশটটিতে দেখতে পাচ্ছেন আমার একটি প্যারেন্ট ডিরেক্টরি এবং দুটি উপ ডিরেক্টরি রয়েছে এবং দ্বিতীয় উপ-ডিরেক্টরিগুলির অধীনে আমার মডিউল == কমনফিউশন রয়েছে এবং আপনি সিএস.প্যাথ কার্যকর করার পরে ডান দিকটি দেখতে পাচ্ছেন আমি আমার কার্যকরী ডিরেক্টরি দেখতে পাচ্ছি


1

আপনার ফাইলের শুরুতে বিন্দুটি সরান এবং পরম্পরা_কম্পোর্টটি আমদানি করুন

from __future__ import absolute_import

from p_02_paying_debt_off_in_a_year import compute_balance_after

1

। ফাইলে থাকা প্রধান ফোল্ডারের নামটি কেবল ব্যবহার করুন।

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