web-dev-qa-db-fra.com

erreur d'importation: 'Aucun module nommé' * n'existe *

Je reçois cette trace de pile quand je lance la pyramide pserve:

% python $(which pserve) ../etc/development.ini
Traceback (most recent call last):
  File "/home/hughdbrown/.local/bin/pserve", line 9, in <module>
    load_entry_point('pyramid==1.5', 'console_scripts', 'pserve')()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.Egg/pyramid/scripts/pserve.py", line 51, in main
    return command.run()
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.Egg/pyramid/scripts/pserve.py", line 316, in run
    global_conf=vars)
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/pyramid-1.5-py2.7.Egg/pyramid/scripts/pserve.py", line 340, in loadapp
    return loadapp(app_spec, name=name, relative_to=relative_to, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 247, in loadapp
    return loadobj(APP, uri, name=name, **kw)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 271, in loadobj
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 320, in _loadconfig
    return loader.get_context(object_type, name, global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 454, in get_context
    section)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 476, in _context_from_use
    object_type, name=use, global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 406, in get_context
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 296, in loadcontext
    global_conf=global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 337, in _loadfunc
    return loader.get_context(object_type, name, global_conf)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/loadwsgi.py", line 681, in get_context
    obj = lookup_object(self.spec)
  File "/home/hughdbrown/.virtualenvs/ponder/lib/python2.7/site-packages/PasteDeploy-1.5.2-py2.7.Egg/paste/deploy/util.py", line 68, in lookup_object
    module = __import__(parts)
  File "/home/hughdbrown/.virtualenvs/ponder/local/lib/python2.7/site-packages/ponder-0.0.40-py2.7.Egg/ponder/server/__init__.py", line 10, in <module>
    from ponder.server.views import Endpoints, route
ImportError: No module named views

Cela fonctionne très bien à partir d'un REPL python:

% python
Python 2.7.5+ (default, Feb 27 2014, 19:37:08) 
[GCC 4.8.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ponder.server.views import Endpoints, route
>>> 

et à partir d'une importation en ligne de commande:

% python -c "from ponder.server.views import Endpoints, route"

Une sortie abrégée tree montre ce avec quoi je travaille:

% tree
├── __init__.py
├── ponder
│   ├── __init__.py
│   ├── server
│   │   ├── __init__.py
│   │   └── views
│   │       ├── environment_templates.py
│   │       ├── groups.py
│   │       ├── __init__.py
│   │       ├── instances.py
│   │       ├── tasks.py
│   │       └── users.py

Ma PYTHONPATH est définie à la racine de cet arbre:

% echo $PYTHONPATH
/home/hughdbrown/workspace/ept/ponder/lib

J'exécute ceci dans un virtualenv qui utilise Python 2.7. Cela a fonctionné de temps en temps mais je ne peux pas savoir où est le problème. D'une part, le __init__.py semble bien fonctionner avec certaines importations qui viennent juste avant:

from .database import get_db
from .config import parser
from .views import Endpoints, route

(J'ai changé la dernière ligne en une importation absolue. Pas de chance.)

Choses que j'ai essayées:

  1. Reconstruction de virtualenv

  2. Paramètre PYTHONPATH

  3. Utiliser des chemins absolus dans le code

  4. À la recherche d'importations circulaires

Je suis ouvert à d'autres suggestions sur la façon de déboguer cette erreur.


L’erreur que j’ai commise est de ne regarder que l’arbre source. Le problème était vraiment dans l'environnement d'exécution, dans mon virtualenv. Et quand j'ai regardé là, j'ai trouvé que les fichiers souhaités n'étaient pas installés. Le problème, à la racine, était le setup.py.

41
hughdbrown

Mon astuce habituelle consiste simplement à imprimer sys.path dans le contexte actuel où le problème d'importation se produit. Dans votre cas, il semblerait que l'emplacement pour l'impression soit en /home/hughdbrown/.local/bin/pserve. Ensuite, vérifiez les répertoires et fichiers aux endroits indiqués par ce chemin.

Vous faites cela en ayant d'abord:

import sys

et en python 2 avec une expression d'impression:

print sys.path

ou en python 3 avec la fonction print:

print(sys.path)
40
antont

J'ai mis la PYTHONPATH à '.' et cela l'a résolu pour moi.

export PYTHONPATH='.'

Pour un one-liner, vous pouvez aussi facilement faire:

PYTHONPATH='.' your_python_script

Ces commandes sont supposées être exécutées dans un terminal

45
javabeangrinder

J'ai eu le même problème et je l'ai résolu en ajoutant le code suivant en haut du fichier python:

import sys
import os

sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))

Le nombre de répétitions de os.path.dirname dépend de l'emplacement du fichier dans la hiérarchie de votre projet. Par exemple, dans mon cas, la racine du projet se situe à trois niveaux. 

4
Karin Lahyani

J'ai rencontré le même problème et j'essaie pdb.set_trace () avant la ligne d'erreur. 

Mon problème est le nom du paquet dupliqué avec le nom du module, comme:

test
├── __init__.py
├── a
│   ├── __init__.py
│   └── test.py
└── b
    └── __init__.py

et dans le fichier a/__init__.py, utiliser from test.b import xxx causera ImportError: No module named b.

3
joest

Il y a plusieurs façons d’exécuter un script python:

  • exécuté en double-cliquant sur fichier.py (cela ouvre la ligne de commande python)
  • lancez votre fichier.py à partir de l'invite cmd (cmd) (glissez/déposez votre fichier dessus, par exemple)
  • lancez votre fichier.py dans votre IDE (par exemple, pyscripter ou Pycharm)

Chacune de ces méthodes peut exécuter une version différente de python (¤)


Vérifiez quelle version de python est exécutée par cmd: Tapez cmd:

python --version 

Vérifiez quelle version de python est exécutée en cliquant sur .py:  

Option 1:

créez un fichier test.py contenant ceci: 

import sys print (sys.version)
input("exit")

Option 2

tapez cmd:

assoc .py
ftype Python.File

Vérifiez le chemin et si le module (ex: win32clipboard) est reconnu dans le cmd:

créez un fichier test.py contenant ceci: 

python
import sys
sys.executable
sys.path
import win32clipboard
win32clipboard.__file__

Vérifiez le chemin et si le module est reconnu dans le fichier .py

créez un fichier test.py contenant ceci:

import sys
print(sys.executable)
print(sys.path)
import win32clipboard
print(win32clipboard.__file__)

Si la version dans cmd est ok mais pas dans .py c'est parce que le programme par défaut associé à .py n'est pas le bon. Changer la version de python pour .py

Pour changer la version de python associée à cmd:

Control Panel\All Control Panel Items\System\Advanced system setting\Environnement variableIn Variable SYSTEM: définissez la variable path sur votre version python (les chemins sont séparés par ;: cmd utilisez le chemin FIRST, par exemple: C:\chemin\vers\Python27; C:\chemin\vers\Python35 → cmd utiliser python27)

Pour changer la version de python associée à l'extension .py:

Exécutez cmd en tant qu'administrateur:

Write: ftype Python.File="C:\Python35\python.exe" "%1" %* Il définira la dernière version de Python (par exemple, python3.6). Si votre dernière version est la version 3.6 mais que vous voulez la version 3.5, ajoutez simplement quelques xxx dans votre dossier (xxxpython36) pour qu'il prenne la dernière version reconnue qui est python3.5 (après que le cmd ait supprimé le xxx).

Autre:

"Aucune erreur de module" pourrait également provenir d'une erreur de syntaxe entre python et 3 (par exemple, parenthèse manquante pour la fonction d'impression ...)

¤ Ainsi chacun a sa propre version de pip

2
JinSnow

J'ai eu ce problème aussi, j'avais juste oublié de taper workon myproject dans le terminal avant d'exécuter mon programme.

1
Hawker65

La PYTHONPATH n'est pas définie correctement. Exportez-le en utilisant export PYTHONPATH=$PYTHONPATH:/path/to/your/modules.

1
SaGeSpidy

J'ai eu le même problème. Je l'ai résolu en exécutant la commande dans une version différente de Python. J'ai essayé python3 filename.py. Auparavant, j'utilisais Python 2.7.

Une autre possibilité est que le fichier à partir duquel quelque chose est importé contienne BOM (Byte Order Mark). Pour résoudre ce problème, ouvrez le fichier dans un éditeur prenant en charge plusieurs codages, tels que VSCode (Notepad ++), et enregistrez-les dans un autre code de codage, tel que ANSI, UTF-8 (sans nomenclature).

0
Mohammed Shareef C

Au cas où cela intéresserait quiconque, j’avais le même problème lorsque j’exécutais Python dans Cygwin. Dans mon cas, c’était compliant que des pandas n’aient pas été installés même s’ils l’étaient. Le problème était que j'avais 2 installations de python - une sous Windows et une autre sous cygwin (en utilisant l'installateur de cygwin) et bien que toutes deux soient les mêmes versions de Python, l'installation de Cygwin était confuse quant à l'emplacement d'installation de Pandas. Quand j'ai désinstallé Python de cygwin et indiqué Cygwin à l'installation de Windows, tout allait bien

0
S.N.

Si vous avez un script portant le même nom que votre module dans un autre répertoire, il l'utilisera à la place. Par exemple:

module.py

module
|
|--module
|  |
|  |--__init__.py
|  |--module.py

Cela fera en sorte que le premier module.py soit utilisé, pas le second.

0
Arcsector