6
votes

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

J'essaye de faire une importation simple et d'utiliser la bibliothèque tierce emailage.

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

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

Ensuite, importez simplement avec:

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

L'installation fonctionne correctement avec pip - aucune erreur. J'ai vérifié deux fois pour voir que le package emailage existe dans le bon répertoire, et c'est le cas.

Le paquet existe à:

from emailage.client import EmailageClient

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

La sortie de mon sys.path est:

pip install emailage-official

Le répertoire dans lequel l'emailage est installé fait donc 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 beaucoup Python, donc toute aide apprécié.


0 commentaires

3 Réponses :


14
votes

Le problème était lié au nom de mon fichier .

J'ai nommé mon fichier à la hâte emailage.py , puis j'ai essayé d'importer depuis 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 les autres qui rencontrent des problèmes similaires, attention aux conflits de noms Parfois, les choses les plus simples vous font trébucher le plus longtemps.


2 commentaires

Un problème assez connu en Python. Ne nommez jamais vos scripts email.py , test.py , etc.


D'accord - mon inexpérience / rouille Python est clairement visible ici. J'ai complètement oublié que ce type de problème survient dans Python.



7
votes

J'ai rencontré quelque chose de similaire et la réponse d'OP sur la collision d'espace de noms est ce qui m'a finalement renseigné.

J'utilisais le même nom pour un sous-package (répertoire) et un module (fichier) à l'intérieur.

Par exemple, j'ai eu ceci:

$ ./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

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

XXX

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

from myapi.myapi_creds import my_user, my_pass

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


0 commentaires

2
votes

J'ai jeté un coup d'œ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 vous 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:

from LocalSearch.LocalSearch import LocalSearch

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 cela le rend plus lisible. Maintenant, dans le dossier nommé LocalSearch , j'ai 4 fichiers, LocalSearch, LS_apriori et quelques 2 fichiers de test (non pertinents). 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:

    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

Le correctif é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 bien cependant, je suppose que la classe vient d'ajouter une confusion supplémentaire.


0 commentaires