Error de Python "ImportError: ningún módulo llamado"

452

Python está instalado en un directorio local.

Mi árbol de directorios se ve así:

(local directory)/site-packages/toolkit/interface.py

Mi código está aquí:

(local directory)/site-packages/toolkit/examples/mountain.py

Para ejecutar el ejemplo, escribo python mountain.py, y en el código que tengo:

from toolkit.interface import interface

Y me sale el error:

Traceback (most recent call last):
  File "mountain.py", line 28, in ?
    from toolkit.interface import interface
ImportError: No module named toolkit.interface

Ya lo he comprobado sys.pathy allí tengo el directorio /site-packages. Además, tengo el archivo __init__.py.binen la carpeta del kit de herramientas para indicarle a Python que este es un paquete. También tengo un __init__.py.binen el directorio de ejemplos.

No sé por qué Python no puede encontrar el archivo cuando está en sys.path. ¿Algunas ideas? ¿Puede ser un problema de permisos? ¿Necesito algún permiso de ejecución?

Eduardo
fuente
3
Compruebe que tiene permiso de lectura para ese archivo desde python. Ver: stackoverflow.com/a/20999950/1657225
cSn
1
Asegúrese de marcar su directorio como "Rooteo de recursos" para que PyCharm sepa que este es un paquete.
emmmphd
El problema en mi caso fue que no había permiso para los módulos recién instalados 755. Eso se debía a que umasken la máquina se 0027debía a que othersno tenía readpermiso, lo que hacía que el módulo no fuera leído. Agregar readpermiso solucionó mi problema. Vale la pena verificar el permiso del directorio de destino posterior a la instalación.
Anu
Intente volar la URL: stackoverflow.com/questions/47887614/…
Rawan-25
tal vez el nombre del directorio local es interface (ha sido un conflicto).
Benyamin Jafari

Respuestas:

267

Según sus comentarios a la publicación de orip, supongo que esto es lo que sucedió:

  1. Has editado __init__.pyen windows.
  2. El editor de Windows agregó algo que no se imprime, tal vez un retorno de carro (el final de línea en Windows es CR / LF; en Unix es solo LF), o tal vez un CTRL-Z (final de archivo de Windows).
  3. Usó WinSCP para copiar el archivo a su caja de Unix.
  4. WinSCP pensó: "Esto tiene algo que no es texto básico; pondré una extensión .bin para indicar datos binarios".
  5. Los desaparecidos __init__.py (ahora llamado __init__.py.bin) significa que Python no entiende el kit de herramientas como un paquete.
  6. ¿Creas __init__.pyen el directorio apropiado y todo funciona ...?
John Fouhy
fuente
50
Además, python -c 'import sys; ayuda de print sys.path '- a veces el usuario ha colocado los archivos en una ruta no escaneada.
mikebabcock
1
Estoy usando lo mismo, excepto que WinSCP no se agregó .bin.
usuario
99
si tengo un "__init__.py" vacío, ¿sucederá lo mismo?
dietbacon
2
Dios mío, tú mandas! Esta es mi historia: 1. Editaste init .py en Windows 2. Agregó una TAB en lugar de espacios 3. ¡Buscas mucho en Google hasta encontrar esta publicación! ;)
GBrian
1
Para mí, el problema era que estaba usando python driver.pycuando debería haber estado usando python3 driver.pydesde que instalé pip3.
Eric Wiener
72

Hace

(local directory)/site-packages/toolkit

tener un __init__.py ?

Para que la importación recorra sus directorios, cada directorio debe tener un __init__.pyarchivo.

igorgue
fuente
1
¡Buen punto! Observación: desde Python 3.3, se reconocerá cualquier directorio en sys.path con un nombre que coincida con el nombre del paquete.
PatrickT
1
¿No es esto solo necesario para referencias relativas de ruta? ¿Por qué cada directorio debe tenerlo?
Sonic Soul
56

Me encontré con algo muy similar cuando hice este ejercicio en LPTHW; Nunca pude hacer que Python reconociera que tenía archivos en el directorio desde el que llamaba. Pero al final pude hacerlo funcionar. Lo que hice y lo que recomiendo es probar esto:

(NOTA: desde su publicación inicial, supongo que está utilizando una máquina basada en * NIX y está ejecutando cosas desde la línea de comandos, por lo que este consejo se adapta a eso. Desde que ejecuto Ubuntu, esto es lo que hice)

1) Cambie el directorio (cd) al directorio sobre el directorio donde están sus archivos. En este caso, está intentando ejecutar el mountain.pyarchivo e intentando llamar al toolkit.interface.pymódulo, que se encuentra en directorios separados. En este caso, iría al directorio que contiene rutas a ambos archivos (o, en otras palabras, al directorio más cercano que comparten las rutas de ambos archivos). Que en este caso es el toolkitdirectorio.

2) Cuando esté en el tookitdirectorio, ingrese esta línea de código en su línea de comando:

export PYTHONPATH=.

Esto establece su PYTHONPATH en ".", Lo que básicamente significa que su PYTHONPATH ahora buscará cualquier archivo llamado dentro del directorio en el que se encuentra actualmente (y más al punto, en las ramas del subdirectorio del directorio en el que se encuentra. Por lo tanto, no solo se ve en su directorio actual, sino en todos los directorios que están en su directorio actual).

3) Después de configurar su PYTHONPATH en el paso anterior, ejecute su módulo desde su directorio actual (el toolkit directorio). Python ahora debería encontrar y cargar los módulos que especificó.

Espero que esto ayude. Yo mismo estaba bastante frustrado con esto.

Specterace
fuente
2
O en Windows set PYTHONPATH=..
cjbarth
Esto funcionó para mí. También COMPLETAMENTE simplifiqué mis frustraciones de PYTHONPATH, ya que tendría que actualizarlo a una ruta absoluta cada vez que cambie de máquina. Gracias, gracias, gracias.
the_e
41

En * nix, también asegúrese de que PYTHONPATH esté configurado correctamente, especialmente que tenga este formato:

 .:/usr/local/lib/python

(Cuidado con el .: en cuenta el principio, para que también pueda buscar en el directorio actual).

También puede estar en otras ubicaciones, según la versión:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.
Renaud
fuente
66
También puede ser .:/usr/lib/python, .:/usr/lib/python2.6, .:/usr/lib/python2.7, etc, dependiendo de la versión
Nikita Volkov
Para mí, el módulo está en /usr/local/lib/python3.4/dist-packages pero cuando escribo python3 en el terminal (ubuntu) e intento importarlo, no me lo permite, diciendo que no existe "ImportError: no existe ningún módulo x"
user65165
Agregar #!/usr/bin/pythonal final de un archivo también debería funcionar, ¿verdad?
Nearoo
1
@Nearoo, no creo que eso funcione. Además, generalmente este shebang se agrega en la parte superior de un archivo.
Renaud el
2
En MacOSX lo solucionó agregando PYTHONPATH = / usr / local / lib / python2.7 / site-packages a los scripts de inicio.
Johan Snowgoose
23

Resolví mi propio problema y escribiré un resumen de las cosas que estaban mal y la solución:

El archivo debe llamarse exactamente __init__.py. Si la extensión es diferente, como en mi caso .py.bin, Python no puede moverse a través de los directorios y luego no puede encontrar los módulos. Para editar los archivos necesita usar un editor de Linux, como vi o nano . Si usa un editor de Windows, esto escribirá algunos caracteres ocultos.

Otro problema que lo afectaba era que tenía otra versión de Python instalada por la raíz, por lo que si alguien está trabajando con una instalación local de python, asegúrese de que la instalación de Python que ejecuta los programas sea la Python local. Para verificar esto, simplemente haga which pythony vea si el ejecutable es el que está en su directorio local. De lo contrario, cambie la ruta, pero asegúrese de que el directorio local de Python esté antes que el otro Python.

Eduardo
fuente
Un problema que tuve fue que un módulo fue (re) instalado por pip con solo el usuario raíz para acceder a él, por lo que el usuario que ejecutó el programa no lo vio.
Jānis Elmeris
@ JānisElmeris, ¿puedes dar más detalles sobre el comentario anterior? Creo que también estoy enfrentando un error similar. Tengo mis __init__.pyarchivos colocados en el directorio relevante pero instalé manualmente un paquete usando setup.py. Cómo la instalación de un nuevo paquete interferiría con las importaciones.
Krishna Oza,
@darth_coder, lo siento, eso fue hace seis años y no recuerdo el caso. Además, estoy lidiando con Python muy poco, en absoluto últimamente. Por lo que escribí, puedo pensar que instalé un paquete como root, que cambió los permisos para que otros usuarios no tuvieran el acceso que tenían antes.
Jānis Elmeris
19

una solución fácil es instalar el módulo usando en python -m pip install <library-name>lugar de pip install <library-name> usar sudo en caso de restricciones administrativas

Badr Bellaj
fuente
2
¿Qué python -mlogra delante pip install?
sporc
1
@sporc: cuando usa el indicador de línea de comando -m, Python importará un módulo o paquete para usted y luego lo ejecutará como un script. Cuando no usa el indicador -m, el archivo que nombró se ejecuta solo como un script.
Tony Ciccarone
No estoy seguro de lo que esta respuesta está tratando de decir wrt python -m pip...funcionando, pero pip...no lo hizo: son efectivamente la misma cosa, suponiendo que realmente estén en el mismo pythondirectorio. Posiblemente, la situación observada fue que el pipprograma independiente no estaba disponible en alguna versión anterior de Python (pero ahora está en las últimas 2.7 y 3.x). En ese caso, el pythonestaba en un virtualenv local y pipno lo estaba, por python -m pip installlo que se instalaría en el virtualenv local, mientras pipque intentaría instalarlo en el sistema python (y fallaría sin sudo). En cualquier caso, no tiene sentido.
michael
17

Para marcar un directorio como un paquete, necesita un archivo llamado __init__.py, ¿esto ayuda?

orip
fuente
Ya tengo un archivo llamado init .py.bin, si cambio el nombre a init .py, aparece este error: /__init__.py ", línea 1" utilities "," demo "] ^ SyntaxError: sintaxis no válida
Eduardo
¿Qué hay en init .py? Publíquelo como parte de su pregunta, por favor.
S.Lott
No hay nada, está vacío. Fue con el paquete que descargué, ¿necesito escribir algo en el archivo?
Eduardo
@ S.Lott: no necesitas poner nada en tu init .py ¿verdad?
igorgue
1
@Eduardo. Su init .py recibe un error. Y dices que está vacío. Eso es difícil de conciliar. Y no se puede llamar init .py.bin: Python ignoraría este archivo. Por lo general, no puede tener nada.
S.Lott
16

Usando PyCharm(parte de la suite JetBrains) necesita definir su directorio de script como Fuente:
Right Click > Mark Directory as > Sources Root

Monohilo
fuente
12

Estás leyendo esta respuesta que dice que estás __init__.pyen el lugar correcto, has instalado todas las dependencias y todavía estás obteniendo el ImportError.

Estaba enfrentando un problema similar, excepto que mi programa funcionaría bien cuando se ejecutaba usando PyCharm, pero el error anterior cuando lo ejecutaba desde el terminal. Después de investigar más, descubrí que PYTHONPATHno tenía la entrada para el directorio del proyecto. Entonces, configuré PYTHONPATHpor declaración de importación funciona en PyCharm pero no desde la terminal :

export PYTHONPATH=$PYTHONPATH:`pwd`  (OR your project root directory)

Hay otra forma de hacer esto usando sys.pathcomo:

import sys
sys.path.insert(0,'<project directory>') OR
sys.path.append('<project directory>')

Puede usar insertar / agregar según el orden en el que desea que se busque su proyecto.

avp
fuente
12

Para mí, fue algo realmente estúpido. Instalé la biblioteca usando pip3 installpero estaba ejecutando mi programa python program.pyen lugar de hacerlo python3 program.py.

kev
fuente
1
Guauu ! Eso también funcionó para mí.
JavaDeveloper
1
Salvaste mi día.
Aymen
7

Sip. Necesita el directorio para contener el __init__.pyarchivo, que es el archivo que inicializa el paquete. Aquí, mira esto .

Los archivos __init__.py son necesarios para que Python trate los directorios como paquetes; Esto se hace para evitar que los directorios con un nombre común, como una cadena, oculten involuntariamente módulos válidos que se producen más adelante en la ruta de búsqueda del módulo. En el caso más simple, __init__.py puede ser solo un archivo vacío, pero también puede ejecutar el código de inicialización para el paquete o establecer la variable __todos__, que se describe más adelante.

miya
fuente
6
  1. Debe tener el archivo __ init__.py en el mismo directorio donde está importando el archivo.
  2. No puede intentar importar un archivo que tenga el mismo nombre y ser un archivo de 2 carpetas configuradas en PYTHONPATH.

por ejemplo: / etc / environment

PYTHONPATH = $ PYTHONPATH: / opt / folder1: / opt / folder2

/ opt / folder1 / foo

/ opt / folder2 / foo

Y, si está intentando importar un archivo foo, python no sabrá cuál desea.

from foo import ... >>> importador: ningún módulo llamado foo

Iasmini Gomes
fuente
5

Mis dos centavos:

ingrese la descripción de la imagen aquí

Escupir:

Traceback (most recent call last):
      File "bash\bash.py", line 454, in main
        import bosh
      File "Wrye Bash Launcher.pyw", line 63, in load_module
        mod = imp.load_source(fullname,filename+ext,fp)
      File "bash\bosh.py", line 69, in <module>
        from game.oblivion.RecordGroups import MobWorlds, MobDials, MobICells, \
    ImportError: No module named RecordGroups

Esto me confundió muchísimo: revisé publicaciones y publicaciones que sugerían feos trucos de syspath (como ves __init__.py, todos estaban allí). Bien, resulta que game / oblivion.py y game / oblivion confundieron a Python y escupieron el inútil "No módulo llamado RecordGroups". Me interesaría una solución alternativa y / o enlaces que documenten este comportamiento (mismo nombre) -> EDITAR (2017.01.24) - eche un vistazo a ¿Qué sucede si tengo un módulo y un paquete con el mismo nombre? Curiosamente, normalmente los paquetes tienen prioridad, pero aparentemente nuestro lanzador viola esto.

EDITAR (2015.01.17): No mencioné que usamos un lanzador personalizado diseccionado aquí .

Mr_and_Mrs_D
fuente
más bien el camino está fuera. game.oblivion.RecordGroups !== game/oblivion/patchers/RecordGroups.py Puede querer arreglar eso agregando su código de Python para usar:game.oblivion.patchers.RecordGroups
Dwight Spencer
@DwightSpencer: Estoy seguro de que importé los "Grupos de registro", game.oblivion.__init__.pypero es posible que tenga que verificar esto
Mr_and_Mrs_D
4

Linux: los módulos importados se encuentran en /usr/local/lib/python2.7/dist-packages

Si está utilizando un módulo compilado en C, no se olvide de cambiar el archivo .so después sudo setup.py install.

sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
KrisWebDev
fuente
3

En mi caso, el problema era que estaba vinculando a depurar python & boost::Python, lo que requiere que la extensión sea FooLib_d.pyd, no solo FooLib.pyd; cambiar el nombre del archivo o actualizar las CMakeLists.txtpropiedades corrigió el error.

Peter Karasev
fuente
3

Si ha probado todos los métodos proporcionados anteriormente pero falló, tal vez su módulo tenga el mismo nombre que un módulo incorporado. O bien, un módulo con el mismo nombre existente en una carpeta que tiene una alta prioridad ensys.path que la de su módulo.

Para depurar, diga sus from foo.bar import bazquejas ImportError: No module named bar. Cambiando a import foo; print foo, que mostrará el camino de foo. ¿Es lo que esperas?

De lo contrario, cambie el nombre fooo use las importaciones absolutas .

liushuaikobe
fuente
1
Para mí, esto rinde ImportError: No module named foo.
alex
3

Mi problema fue que agregué el directorio con el __init__.pyarchivo a PYTHONPATH, cuando en realidad necesitaba agregar su directorio padre.

Rico
fuente
3

A todos aquellos que todavía tienen este problema. Creo que Pycharm se confunde con las importaciones. Para mí, cuando escribo 'desde el espacio de nombres importar algo', la línea anterior se subraya en rojo, lo que indica que hay un error, pero funciona. Sin embargo, '' desde .namespace import algo 'no se subraya, pero tampoco funciona.

Tratar

try:
    from namespace import something 
except NameError:
    from .namespace import something
AKJ
fuente
1
El primero es la sintaxis de Python 2, el segundo es Python 3.
Tanya Branagan
2

Solucioné mi problema escribiendo print (sys.path)y descubrí que Python estaba usando paquetes desactualizados a pesar de una instalación limpia. La eliminación de estos python hechos usa automáticamente los paquetes correctos.

limón
fuente
2

En mi caso, porque estoy usando PyCharm y PyCharm creo un 'venv' para cada proyecto en la carpeta del proyecto, pero es solo un mini env de python. Aunque ha instalado las bibliotecas que necesita en Python, pero en su proyecto personalizado 'venv', no está disponible. Esta es la verdadera razón de 'ImportError: ningún módulo llamado xxxxxx' ocurrió en PyCharm. Para resolver este problema, debe agregar bibliotecas al entorno personalizado de su proyecto siguiendo estos pasos:

  • En PyCharm, desde el menú 'Archivo' -> Configuración
  • En el cuadro de diálogo Configuración, Proyecto: XXXProject-> Project Interpreter
  • Haga clic en el botón "Agregar", le mostrará el cuadro de diálogo 'Paquetes disponibles'
  • Busque en su biblioteca, haga clic en 'Instalar paquete'
  • Luego, todo el paquete que necesita se instalará en su carpeta personalizada 'venv' del proyecto.

Diálogo de configuración

Disfrutar.

Yuanhui
fuente
0

Después de sufrir el mismo problema, descubrí que mi resolución era eliminar todos los pycarchivos de mi proyecto, parece que estos archivos en caché de alguna manera estaban causando este error.

La forma más fácil que encontré para hacer esto fue navegar a mi carpeta de proyectos en el explorador de Windows y buscar *.pyc, luego seleccionar todo ( Ctrl+ A) y eliminarlos ( Ctrl+ X).

Es posible que pudiera haber resuelto mis problemas simplemente borrando el pycarchivo específico , pero nunca lo intenté

Sayse
fuente
0

Me enfrenté al mismo problema: Import error. Además, la biblioteca se ha instalado al 100% correctamente. El origen del problema fue que en mi PC 3 se instaló la versión de python (paquete anaconda)). Es por eso que la biblioteca se instaló no en el lugar correcto. Después de eso, acabo de cambiar a la versión adecuada de python en mi IDE PyCharm.

Rocketq
fuente
0

Yo tenía el mismo error. Fue causado por alguien que creó una carpeta en la misma carpeta que mi script, cuyo nombre entró en conflicto con un módulo que estaba importando desde otro lugar. En lugar de importar el módulo externo, miró dentro de esta carpeta que obviamente no contenía los módulos esperados.

Toivo Säwén
fuente
0

Tuve el mismo problema (Python 2.7 Linux), encontré la solución y me gustaría compartirla. En mi caso, tuve la siguiente estructura:

Booklet
-> __init__.py
-> Booklet.py
-> Question.py
default
-> __init_.py
-> main.py

En 'main.py' había intentado sin éxito todas las combinaciones a continuación:

from Booklet import Question
from Question import Question
from Booklet.Question import Question
from Booklet.Question import *
import Booklet.Question
# and many othet various combinations ...

La solución fue mucho más simple de lo que pensaba. Cambié el nombre de la carpeta "Folleto" a "folleto" y eso es todo. Ahora Python puede importar la clase Pregunta normalmente usando en 'main.py' el código:

from booklet.Booklet import Booklet
from booklet.Question import Question
from booklet.Question import AnotherClass

De esto puedo concluir que los nombres de paquetes (carpetas) como 'folleto' deben comenzar en minúsculas, de lo contrario, Python lo confunde con nombres de clase y nombres de archivo.

Aparentemente, este no fue su problema, pero la respuesta de John Fouhy es muy buena y este hilo tiene casi cualquier cosa que pueda causar este problema. Entonces, esto es una cosa más y espero que tal vez esto pueda ayudar a otros.

ioaniatr
fuente
0

En mi caso, estaba incluyendo la ruta a la carpeta package.egg en lugar del paquete real debajo. Copié el paquete al nivel superior y funcionó.

Fakrudeen
fuente
0

Esto funcionó para mí: __init__.pyarchivo creado dentro de la carpeta principal (en su caso, dentro de la site-packagescarpeta). E importado así:

from site-packages.toolkit.interface import interface

¡Espero que te sea útil también!

Sherzod
fuente
0

En el servidor Linux intente dos2unix script_name

(elimine todos (si hay alguno) pycarchivos con comando find . -name '*.pyc' -delete)

y vuelva a ejecutar en el caso si trabajó en script en Windows

Poli
fuente
0

En mi caso, estaba usando sys.path.insert()para importar un módulo local y obtenía module not foundde una biblioteca diferente. Tuve que poner sys.path.insert()por debajo de las importaciones que informaron module not found. Supongo que la mejor práctica es poner sys.path.insert()en el fondo de sus importaciones.

Michał Zawadzki
fuente