wake-up-neo.net

ModuleNotFoundError: Was bedeutet es, dass __main__ kein Paket ist?

Ich versuche, ein Modul von der Konsole aus auszuführen. Die Struktur meines Verzeichnisses lautet wie folgt:

 enter image description here

Ich versuche, das Modul p_03_using_bisection_search.py vom Verzeichnis problem_set_02 aus auszuführen:

$ python3 p_03_using_bisection_search.py

Der Code in p_03_using_bisection_search.pyist:

__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 __== '__main__':
    main()

Ich importiere eine Funktion, die sich in p_02_paying_debt_off_in_a_year.py befindet.

__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 __== '__main__':
    main()

Ich erhalte folgende Fehlermeldung:

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

Ich habe keine Ahnung, wie ich dieses Problem lösen kann. Ich habe versucht, eine __init__.py-Datei hinzuzufügen, aber sie funktioniert immer noch nicht.

84
lmiguelvargasf

Entferne einfach den Punkt für den relativen Import und mache:

from p_02_paying_debt_off_in_a_year import compute_balance_after
117
Moses Koledoye

Ich habe das gleiche Problem wie Sie. Ich denke, das Problem ist, dass Sie den relativen Import in in-package import verwendet haben. In Ihrem Verzeichnis befindet sich kein __init__.py. Also importiere, wie Moses oben antwortete. 

Ich denke, das Kernproblem ist, wenn Sie mit einem Punkt importieren, wie:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

Es ist äquivalent zu:

from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after

Wir alle wissen, dass __main__ auf Ihr aktuelles Modul p_03_using_bisection_search.py verweist. 

Hier kommt das Problem:

Wenn der Interpreter in p_03.py eingeht, ist das Skript gleich: 

from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after 

Offensichtlich enthält p_03_using_bisection_search keine Module oder Instanzen mit dem Namen p_02_paying_debt_off_in_a_year. 

Kurz gesagt, der Interpreter kennt Ihre Verzeichnisarchitektur nicht.


Also habe ich eine sauberere Lösung gefunden, ohne die Wertgegenstände in der Python-Umgebung zu ändern (nachdem ich nachgefragt habe, wie Requests sich im relativen Import befinden):

Die Hauptarchitektur des Verzeichnisses ist:

main.py

setup.py

---problem_set_02/

------__init__.py

------p01.py

------p02.py

------p03.py

Dann schreibe in __init__.py:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

Hier ist __main____init__, es bezieht sich genau auf das Modul problem_set_02.

Dann gehe zu main.py:

import problem_set_02

Sie können auch einen setup.py schreiben, um der Umgebung ein bestimmtes Modul hinzuzufügen.

44
hcnhcn012

Hi Bitte befolgen Sie die folgenden Schritte, um dieses Problem zu beheben. Wenn Sie ein Verzeichnis und ein Unterverzeichnis erstellt haben, folgen Sie den untenstehenden Schritten. Bitte beachten Sie, dass alle Verzeichnisse "init .py" haben, damit sie erkannt werden als ein Verzeichnis. 

  1. "sys importieren" und "sys.path" ausführen, können Sie alle Pfade sehen, die von python durchsucht werden. Sie müssen Ihr aktuelles Arbeitsverzeichnis sehen können. 

  2. Importieren Sie nun das Unterverzeichnis und das entsprechende Modul, das Sie mit import verwenden möchten: "import subdir.subdir.modulename as abc". Jetzt können Sie die Methoden in diesem Modul verwenden ScreenShotforSameIssue

wie Sie in diesem Screenshot sehen können, habe ich ein übergeordnetes Verzeichnis und zwei Unterverzeichnisse. Unter zweiten Unterverzeichnissen habe ich das Modul == CommonFunction und Sie sehen rechts nach der Ausführung von sys.path, dass ich mein Arbeitsverzeichnis sehen kann

2
Gaurav Singh

Versuchen Sie es als:

python3 -m p_03_using_bisection_search

1
Dan Keder