importing - modulenotfounderror: python
Error de Python "ImportError: Ningún módulo llamado" (21)
- Debe tener el archivo __ init__.py en el mismo directorio donde está el archivo que está importando.
- 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.
de foo import ... >>> importerror: no hay módulo llamado foo
Python se instala 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 he comprobado sys.path
y ahí tengo el directorio /site-packages
. Además, tengo el archivo __init__.py.bin
en la carpeta del kit de herramientas para indicar a Python que se trata de un paquete. También tengo un __init__.py.bin
en 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?
Basado en tus comentarios a la publicación de orip, supongo que esto es lo que sucedió:
-
__init__.py
en windows. - El editor de Windows agregó algo que no se imprime, quizás 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).
- Usaste WinSCP para copiar el archivo a tu caja de Unix.
- WinSCP pensó: "Esto tiene algo que no es texto básico; pondré una extensión .bin para indicar datos binarios".
- El
__init__.py
faltante (ahora llamado__init__.py.bin
) significa que Python no entiende el kit de herramientas como un paquete. - Usted crea
__init__.py
en el directorio apropiado y todo funciona ...?
Después de sufrir el mismo problema, encontré que mi resolución era eliminar todos los archivos pyc
de mi proyecto, parece que estos archivos en caché causaron este error.
La forma más sencilla 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 haya podido resolver mis problemas simplemente eliminando el archivo pyc
específico, pero nunca lo intenté
En * nix, asegúrese también de que PYTHONPATH esté configurado correctamente, especialmente que tiene este formato:
.:/usr/local/lib/python
(Tenga en cuenta el .:
Al principio, para que también pueda buscar en el directorio actual).
También puede estar en otras ubicaciones, dependiendo de la versión:
.:/usr/lib/python
.:/usr/lib/python2.6
.:/usr/lib/python2.7 and etc.
En mi caso, el problema era que estaba enlazando para depurar python
& boost::Python
, que requiere que la extensión sea FooLib_d.pyd
, no solo FooLib.pyd
; cambiar el nombre del archivo o actualizar CMakeLists.txt
propiedades de CMakeLists.txt
corrigió el error.
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ó.
Hace
(local directory)/site-packages/toolkit
tener un __init__.py
?
Para hacer que la importación pase por sus directorios, cada directorio debe tener un archivo __init__.py
.
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 olvide cambiar el archivo sudo setup.py install
después de sudo setup.py install
.
sudo chmod 755 /usr/local/lib/python2.7/dist-packages/*.so
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 estaba llamando. Pero al final pude hacerlo funcionar. Lo que hice, y lo que recomiendo, es probar esto:
(NOTA: desde su publicación inicial, asumo que está usando 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 se encuentran sus archivos. En este caso, está intentando ejecutar el archivo mountain.py
e intentar llamar al módulo toolkit.interface.py
, que se encuentran 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 directorio del toolkit
.
2) Cuando esté en el directorio tookit
, 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 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 busca en su directorio actual, sino en todos los directorios que se encuentran en su directorio actual).
3) Una vez que haya configurado su PYTHONPATH en el paso anterior, ejecute el módulo desde su directorio actual (el directorio del toolkit
). Python ahora debe encontrar y cargar los módulos que especificó.
Espero que esto ayude. Yo estaba bastante frustrado con esto yo mismo.
Me enfrenté al mismo problema: Import error
. Además la biblioteca se ha instalado 100% correctamente. El origen del problema fue que en mi PC se ha instalado la versión 3 de python (paquete anaconda). Es por esto que la biblioteca se instaló no en el lugar correcto. Después de eso, acabo de cambiar a la versión correcta de python en mi IDE PyCharm.
Mi problema fue que agregué el directorio con el archivo __init__.py
a PYTHONPATH, cuando en realidad necesitaba agregar su directorio principal.
Mis dos centavos:
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, pasé por publicaciones y publicaciones que sugerían hacks de syspath feos (como ves, mi __init__.py
estaba allí). Bueno, resulta que game / oblivion.py y game / oblivion estaban confundiendo a Python, que escupió el inútil "Ningún módulo llamado RecordGroups". Me gustaría una solución y / o enlaces que documenten este comportamiento (el mismo nombre) -> EDITAR (2017.01.24) - ¿Qué pasa si tengo un módulo y un paquete con el mismo nombre? Es interesante que los paquetes normalmente tienen prioridad, pero al parecer nuestro lanzador viola esto.
EDITAR (2015.01.17): No mencioné que usamos un lanzador personalizado diseccionado here .
Para marcar un directorio como un paquete, necesita un archivo llamado __init__.py
, ¿esto ayuda?
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 usas un editor de Windows, esto escribirá algunos caracteres ocultos.
Otro problema que lo estaba afectando era que tenía una 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 es la Python local. Para verificar esto, solo haga which python
, y 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.
Si ha intentado todos los métodos provistos anteriormente pero falló, quizás 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 prioridad alta en sys.path
que la de su módulo.
Para depurar, diga su from foo.bar import baz
quejas ImportError: No module named bar
. Cambiando para import foo; print foo
import foo; print foo
, que mostrará el camino de foo
. ¿Es lo que esperas?
Si no, cambia el nombre de foo
o usa importaciones absolutas .
Sip. Necesita que el directorio contenga el archivo __init__.py
, que es el archivo que inicializa el paquete. Aquí, mira this .
Los archivos __init__.py son necesarios para que Python trate los directorios como paquetes que contienen; esto se hace para evitar que los directorios con un nombre común, como una cadena, oculten involuntariamente los módulos válidos que aparecen más adelante en la ruta de búsqueda del módulo. En el caso más simple, __init__.py solo puede ser un archivo vacío, pero también puede ejecutar el código de inicialización del paquete o establecer la variable __all__, que se describe más adelante.
Solucioné mi problema escribiendo print (sys.path)
y descubrí que Python estaba usando paquetes print (sys.path)
pesar de una instalación limpia. Eliminando estos hechos, Python utiliza automáticamente los paquetes correctos.
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'' probé 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 pregunta de clase normalmente usando el código ''main.py'':
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 tu problema, pero la respuesta de John Fouhy es muy buena y este hilo tiene casi cualquier cosa que puede causar este problema. Entonces, esto es una cosa más y espero que tal vez esto pueda ayudar a otros.
Utilizando PyCharm
(parte de la suite JetBrains) necesita definir su directorio de script como Fuente:
Right Click > Mark Directory as > Sources Root
Yo tenía el mismo error. Fue causado por alguien que creó una carpeta en la misma carpeta que mi script, cuyo nombre estaba en conflicto con un módulo que estaba importando de otra parte. En lugar de importar el módulo externo, miró dentro de esta carpeta que obviamente no contenía los módulos esperados.
una solución fácil es instalar el módulo usando python -m pip install <library-name>
lugar de pip install <library-name>
puede usar sudo en caso de restricciones de administrador