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:
Reconstruction de virtualenv
Paramètre PYTHONPATH
Utiliser des chemins absolus dans le code
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
.
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)
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
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.
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
.
Il y a plusieurs façons d’exécuter un script python:
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 variable
In 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
J'ai eu ce problème aussi, j'avais juste oublié de taper workon myproject dans le terminal avant d'exécuter mon programme.
La PYTHONPATH
n'est pas définie correctement. Exportez-le en utilisant export PYTHONPATH=$PYTHONPATH:/path/to/your/modules
.
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).
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
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.