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...शायद एक महान विचार नहीं है। मैं सिर्फ मनमानी कोड निष्पादन के लिए अवसर खोलने के बजाय इसे पार्स करूंगा।
23१

2
मुझे यकीन है कि eval(input(...बिट 2to3 द्वारा सुझाव दिया गया था। मैंने आज ही मुझे ऐसा किया था। मुझे खुशी है कि मैं इसके बारे में सुझाव नहीं दे रहा हूं
कॉल

जवाबों:


237

बस सापेक्ष आयात के लिए डॉट निकालें और करें:

from p_02_paying_debt_off_in_a_year import compute_balance_after

56
आप इसे हल करें। मैं जोड़ने पर भी सापेक्ष आयात क्यों काम नहीं कर रहा हूं __init__.py?
lmiguelvargasf

23
स्वीकृत उत्तर मेरे लिए काम नहीं कर रहा है। क्या आप संभवतः एक न्यूनतर उदाहरण सेटअप जोड़कर उत्तर का विस्तार कर सकते हैं?
प्राणदास

13
यह मेरे लिए काम करता है (एक पैकेज के अंदर, यानी एक __init__.pyही फ़ोल्डर में एक खाली के साथ ), हालांकि मेरे PyCharm (2018.2.4) ने इसे "अनारक्षित संदर्भ" के रूप में चिह्नित किया है और आयात को स्वत: पूर्ण करने में विफल है।
djvg

33
@djvg - PyCharm को ठीक करने के लिए आप रूट डायरेक्टरी को रूट रूट के रूप में चिन्हित कर सकते हैं
डेनिस

12
पाइथन के आयात के साथ काम करना विनाशकारी है। यह Python 3, PyCharm की तरह है, और MyPy सभी हमारे खर्च पर बड़ी हंसी उड़ा रहे हैं। यह ऐसा कैसे है जो from ..sibling_pkg.nephew import my_functionPyharm के लिए मान्य है, लेकिन परिणाम ( ValueError: attempted relative import beyond top-level packageMyPy Cannot find module named '.sibling_pkg.nephew'(एकल नोट करें)। "त्रुटि में, दो नहीं)। फिर भी, from sibling_pkg.nephew import my_functionइरादा के अनुसार काम करता है, एक MyPy त्रुटि नहीं है, लेकिन एक PyCharm त्रुटि का परिणाम है।
जुबिनकोन

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, आप सभी पथ को देख पाएंगे जो कि अजगर द्वारा खोजा जा रहा है। आपको अपनी वर्तमान कार्य निर्देशिका को देखने में सक्षम होना चाहिए।

  2. अब उप-निर्देशिका और संबंधित मॉड्यूल को आयात करें जिसे आप आयात का उपयोग करके उपयोग करना चाहते हैं इस आदेश का पालन करें: import subdir.subdir.modulename as abcऔर अब आप उस मॉड्यूल में विधियों का उपयोग कर सकते हैं। ScreenShotforSameIssue

जैसा कि आप इस स्क्रीनशॉट में देख सकते हैं कि मेरे पास एक मूल निर्देशिका और दो उप-निर्देशिकाएं हैं और दूसरी उप-निर्देशिकाओं के तहत मेरे पास मॉड्यूल == कॉमनफंक्शन है और आप sys.path के निष्पादन के बाद दाईं ओर देखते हैं, मैं अपनी कार्यशील निर्देशिका देख सकता हूं


1

अपनी फ़ाइल की शुरुआत में डॉट निकालें और निरपेक्ष_ आयात करें

from __future__ import absolute_import

from p_02_paying_debt_off_in_a_year import compute_balance_after

1

बस मुख्य फ़ोल्डर के नाम का उपयोग करें जो .py फ़ाइल में है।

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