web-dev-qa-db-fra.com

ModuleNotFoundError: Qu'est-ce que cela signifie que __main__ n'est pas un package?

J'essaie de lancer un module à partir de la console. La structure de mon répertoire est la suivante:

 enter image description here

J'essaie d'exécuter le module p_03_using_bisection_search.py à partir du répertoire problem_set_02 en utilisant:

$ python3 p_03_using_bisection_search.py

Le code à l'intérieur de p_03_using_bisection_search.py est:

__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()

J'importe une fonction qui est dans p_02_paying_debt_off_in_a_year.py et dont le code est:

__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()

Je reçois l'erreur suivante:

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

Je ne sais pas comment résoudre ce problème. J'ai essayé d'ajouter un fichier __init__.py, mais cela ne fonctionne toujours pas.

84
lmiguelvargasf

Supprimez simplement le point pour l'importation relative et faites:

from p_02_paying_debt_off_in_a_year import compute_balance_after
117
Moses Koledoye

J'ai le même problème que vous. Je pense que le problème est que vous avez utilisé l'importation relative dans in-package import. Il n'y a pas de __init__.py dans votre répertoire. Donc, importez comme Moïse a répondu ci-dessus. 

Le problème principal, je pense, est lorsque vous importez avec un point, comme:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

Cela équivaut à:

from __main__.p_02_paying_debt_off_in_a_year import compute_balance_after

Nous savons tous que __main__ fait référence à votre module actuel p_03_using_bisection_search.py

Voici le problème:

Lorsque l'interprète entre dans p_03.py, le script est égal à: 

from p_03_using_bisection_search.p_02_paying_debt_off_in_a_year import compute_balance_after 

Apparemment, p_03_using_bisection_search ne contient aucun module ou instance appelé p_02_paying_debt_off_in_a_year. 

En bref, l'interprète ne connaît pas l'architecture de votre répertoire.


Je suis donc arrivé à une solution plus propre sans changer les objets de valeur de l’environnement Python (après avoir recherché comment requêtes do en importation relative):

L'architecture principale de l'annuaire est:

main.py

setup.py

---problem_set_02/

------__init__.py

------p01.py

------p02.py

------p03.py

Puis écrivez dans __init__.py:

from .p_02_paying_debt_off_in_a_year import compute_balance_after

Ici, __main__ est __init__, il se réfère exactement au module problem_set_02.

Ensuite, allez à main.py:

import problem_set_02

Vous pouvez également écrire un setup.py pour ajouter un module spécifique à l'environnement.

44
hcnhcn012

Salut S'il vous plaît suivez l'étape ci-dessous, vous résoudrez ce problème . Si vous avez créé un répertoire et un sous-répertoire, suivez les étapes ci-dessous et s'il vous plaît gardez à l'esprit que tout répertoire doit avoir "init .py" pour le faire reconnaître comme un répertoire. 

  1. "import sys" et exécutez "sys.path", vous pourrez voir tous les chemins recherchés par python.Vous devez pouvoir voir votre répertoire de travail actuel. 

  2. Maintenant, importez le sous-répertoire et le module respectif que vous souhaitez utiliser avec import suivez cette commande: "import subdir.subdir.modulename as abc" et vous pouvez maintenant utiliser les méthodes de ce module . ScreenShotforSameIssue

comme vous pouvez le voir sur cette capture d'écran, j'ai un répertoire parent et deux sous-répertoires et, dans le deuxième sous-répertoire, j'ai le module == CommonFunction et vous voyez à droite après l'exécution de sys.path, je vois mon répertoire de travail.

2
Gaurav Singh

Essayez de le lancer en tant que:

python3 -m p_03_using_bisection_search

1
Dan Keder