web-dev-qa-db-fra.com

Python 'Aucun module nommé' error; 'package' n'est pas un package

J'essaie de faire une importation simple et d'utiliser la bibliothèque tierce de messagerie électronique.

Selon leur documentation, la façon d'utiliser leur bibliothèque est la suivante:

pip install emailage-official

Ensuite, importez simplement avec:

from emailage.client import EmailageClient

L'installation fonctionne bien avec pip - aucune erreur. J'ai revérifié pour voir que le package de messagerie existe dans le bon répertoire, et c'est le cas.

Le package existe sur:

C:\Users\aaron\AppData\Local\Programs\Python\Python37-32\Lib\site-packages\emailage

Ce dossier contient (apparemment) les fichiers corrects avec un __init__.py et tout. Cependant, le pylint et l'interpréteur de ligne de commande me lancent un 'Aucun module nommé' emailage.client '; 'emailage' n'est pas une erreur de package.

La sortie de mon sys.path est:

[... 
'C:\\Users\\aaron\\AppData\\Local\\Programs\\Python\\Python37-32\\lib\\site-packages'
...
]

Donc, le répertoire où l'emailage est installé fait partie du chemin ... et enfin j'ai installé numpy par pip juste pour tester s'il fonctionnait correctement. Numpy est installé dans le même dossier de packages de site que l'emailage, et cela fonctionne bien lorsqu'il est importé, donc je suis bloqué.

Je n'utilise généralement pas Python beaucoup, donc toute aide serait appréciée.

4
Aaron Taveras

Le problème était dans le nom de mon fichier.

J'ai nommé mon fichier à la hâte emailage.py puis a essayé d'importer à partir de emailage.client.

Je suppose que Python a regardé dans mon répertoire actuel et correspondait aux noms du fichier sur lequel je travaillais avant de vérifier les bibliothèques tierces installées.

Après avoir renommé mon fichier, tout semble correct.

Pour ceux qui rencontrent des problèmes similaires - attention aux noms conflictuels. Parfois, les choses les plus simples vous font trébucher le plus longtemps.

7
Aaron Taveras

Je suis tombé sur quelque chose de similaire et la réponse d'OP à propos de la collision d'espace de noms est ce qui m'a finalement permis de comprendre.

J'utilisais le même nom pour un sous-package (répertoire) et un module (fichier) qu'il contient.

Par exemple, j'avais ceci:

/opt/mylib/myapi
/opt/mylib/myapi/__init__.py
/opt/mylib/myapi/myapi_creds.py        # gitignored file for user/pass
/opt/mylib/myapi/myapi.py              # base module, load creds and connect
/opt/mylib/myapi/myapi_dostuff.py      # call myapi.py and do work

Le script 'myapi.py' importe les informations d'identification de myapi_creds.py via cette instruction:

from myapi.myapi_creds import my_user, my_pass

Le test du module 'myapi.py' a entraîné cette erreur:

$ ./myapi.py
Traceback (most recent call last):
  File "./myapi.py", line 12, in <module>
    from myapi.myapi_creds import my_user, my_pass
  File "/opt/mylib/myapi/myapi.py", line 12, in <module>
    from myapi.myapi_creds import my_user, my_pass
ModuleNotFoundError: No module named 'myapi.myapi_creds'; 'myapi' is not a package

La solution était de renommer myapi.py à myapi_base.py donc son nom n'entre pas en collision avec le nom du sous-package.

3
ahxn81

J'ai jeté un œil à ce problème, et même si ce n'est pas exactement la même erreur que j'ai rencontrée, cela m'a aidé à le résoudre. Je vais expliquer la situation que j'ai eue, car je pense que certains utilisateurs pourraient trouver cela pratique. Donc, j'obtenais le journal des erreurs suivant:

    Traceback (most recent call last):
  File "/home/kemal/Programming/Python/Preference_Articulation/LocalSearch/LS_apriori.py", line 1, in <module>
    from LocalSearch.LocalSearch import LocalSearch
ModuleNotFoundError: No module named 'LocalSearch.LocalSearch'; 'LocalSearch' is not a package

La structure de mon projet est la suivante (en utilisant PyCharm): Vue de la structure du projet

La chose importante à noter est que j'ai séparé mon code en plusieurs dossiers, car il le rend plus lisible. Maintenant, dans le dossier nommé LocalSearch J'ai 4 fichiers, LocalSearch, LS_apriori et environ 2 fichiers de tests (sans objet). En essayant d'exécuter le fichier LS_apriori (qui utilise des méthodes et des classes du fichier LocalSearch), j'obtenais l'erreur fournie ci-dessus. Le code en particulier n'est pas important, et la façon dont j'ai géré les importations était la suivante:

from LocalSearch.LocalSearch import LocalSearch

La solution était simple. J'ai renommé le fichier py LocalSearch en Local_Search (je viens d'ajouter un trait de soulignement ). Ensuite, l'erreur a disparu.

Donc mon problème était de posséder un dossier (package) avec le même nom qu'un fichier (module) à l'intérieur, qui a une classe à l'intérieur avec le même nom. Python n'aimait pas ça. Avoir des modules avec le même nom que des packages à l'intérieur est très bien cependant, je suppose que la classe vient d'ajouter une confusion supplémentaire.

0
Kemica