error de importación: ‘No hay módulo llamado’ * no * existe

Recibo este rastro de stack cuando comienzo a pyramid pserve:

% python $(which pserve) ../etc/development.ini Traceback (most recent call last): File "/home/hughdbrown/.local/bin/pserve", line 9, in  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  from ponder.server.views import Endpoints, route ImportError: No module named views 

Esto funciona bien desde un Python REPL:

 % 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 >>> 

y desde una linea de comando importamos:

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

Una salida de tree abreviada muestra con qué estoy trabajando:

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

Mi PYTHONPATH se establece en la raíz de este árbol:

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

Estoy ejecutando esto en un virtualenv que usa Python 2.7. He tenido este trabajo de vez en cuando, pero no puedo averiguar dónde está el problema. Por un lado, el __init__.py parece estar bien con algunas importaciones que vienen justo antes:

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

(Cambié la última línea a una importación absoluta. Sin suerte.)

Cosas que he probado:

  1. Reconstruyendo virtualenv

  2. Configuración de PYTHONPATH

  3. Usando rutas absolutas en el código

  4. Buscando importaciones circulares

Estoy abierto a más sugerencias sobre cómo depurar este error.


Así que el error que cometí fue mirar solo el árbol fuente. El problema estaba realmente en el entorno de ejecución, en mi virtualenv. Y cuando miré allí, descubrí que los archivos deseados no se estaban instalando. El problema, en la raíz, fue el setup.py .

Mi truco habitual es simplemente imprimir sys.path en el contexto real donde ocurre el problema de importación. En su caso, parece que el lugar para la impresión está en /home/hughdbrown/.local/bin/pserve . Luego verifique los directorios y archivos en los lugares que muestra la ruta.

Lo haces teniendo primero:

 import sys 

y en python 2 con expresión impresa:

 print sys.path 

o en python 3 con la función de impresión:

 print(sys.path) 

Puse el PYTHONPATH a '.' Y eso me lo resolvió.

 export PYTHONPATH='.' 

Para una sola línea usted podría hacer tan fácilmente:

 PYTHONPATH='.' your_python_script 

Se espera que estos comandos se ejecuten en un terminal.

Tuve el mismo problema, y ​​lo resolví agregando el siguiente código en la parte superior del archivo de python:

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

La cantidad de repeticiones de os.path.dirname depende de la ubicación del archivo en la jerarquía de su proyecto. Por ejemplo, en mi caso, la raíz del proyecto está tres niveles arriba.

Me encontré con el mismo problema, y ​​trato de pdb.set_trace () antes de la línea de error.

Mi problema es el nombre del paquete duplicado con el nombre del módulo, como:

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

y en el archivo a/__init__.py , el uso from test.b import xxx causará ImportError: No module named b .

Hay varias formas de ejecutar el script de Python:

  • ejecutado haciendo doble clic en file.py (se abre la línea de comandos de python)
  • ejecute su archivo.py desde el indicador de cmd (cmd) (arrastre / suelte su archivo, por ejemplo)
  • ejecute su archivo.py en su IDE (por ejemplo, pyscripter o Pycharm)

Cada una de estas formas puede ejecutar una versión diferente de python (¤)


Compruebe qué versión de Python se ejecuta mediante cmd: escriba cmd:

 python --version 

Compruebe qué versión de python se ejecuta al hacer clic en .py:

Opción 1 :

Crea un test.py conteniendo esto:

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

Opción 2 :

escriba cmd:

 assoc .py ftype Python.File 

Compruebe la ruta y si el módulo (por ejemplo, win32clipboard) se reconoce en el cmd:

Crea un test.py conteniendo esto:

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

Compruebe la ruta y si el módulo es reconocido en el .py

Crea un test.py conteniendo esto:

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

Si la versión en cmd está bien, pero no en .py, es porque el progtwig predeterminado asociado con .py no es el correcto. Cambiar la versión de python para .py

Para cambiar la versión de python asociada con cmd:

Control Panel\All Control Panel Items\System\Advanced system setting\Environnement variable En la Control Panel\All Control Panel Items\System\Advanced system setting\Environnement variable SISTEMA, configure la variable de path a su versión de python (la ruta está separada por;: cmd usa la ruta PRIMERA, por ejemplo: C: \ ruta \ a \ Python27 ; C: \ ruta \ a \ Python35 → cmd usará python27)

Para cambiar la versión de python asociada con la extensión .py:

Ejecuta cmd como administrador:

Escriba: ftype Python.File="C:\Python35\python.exe" "%1" %* Establecerá la última versión de python (por ejemplo, python3.6). Si su última versión es 3.6 pero desea 3.5, simplemente agregue un poco de xxx en su carpeta (xxxpython36) para que tome la última versión reconocida que es python3.5 (después de que el cmd elimine el xxx).

Otro:

“No hay error de módulo” también podría provenir de un error de syntax btw python et 3 (por ejemplo, paréntesis faltantes para la función de impresión …)

¤ Así cada uno de ellos tiene su propia versión pip.

También tuve este problema, me había olvidado de escribir workon myproject en el terminal antes de ejecutar mi progtwig.

El PYTHONPATH no está configurado correctamente. Exportelo usando export PYTHONPATH=$PYTHONPATH:/path/to/your/modules .

Tuve el mismo problema. Lo resolví ejecutando el comando en una versión diferente de python. He intentado python3 filename.py . Antes estaba usando Python 2.7.

Otra posibilidad es que el archivo desde el cual se importa algo puede contener BOM (Byte Order Mark). Se puede resolver abriendo el archivo en algún editor que admita encoding múltiple como VSCode (Notepad ++) y guardándolo en un estado de encoding diferente como ANSI, UTF-8 (sin BOM).

En caso de que esto sea de interés para alguien, tuve el mismo problema cuando estaba ejecutando Python en Cygwin, en mi caso fue que los pandas no estaban instalados, aunque sí lo estaban. El problema era que tenía 2 instalaciones de python: una en Windows y otra en cygwin (usando el instalador de cygwin) y aunque ambas eran las mismas versiones de Python, la instalación de Cygwin estaba confundida acerca de dónde estaba instalada Pandas. Cuando desinstalé Python de Cygwin y señalé a Cygwin la instalación de Windows, todo estaba bien.

Si tiene un script con el mismo nombre que su módulo en otro directorio, lo utilizará en su lugar. Por ejemplo:

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

Esto hará que se use el primer module.py, no el segundo.