Pregunta

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 tengo:

from toolkit.interface import interface

Y obtengo 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 allí tengo el directorio / site-packages . Además, tengo el archivo __init __. Py.bin en la carpeta del kit de herramientas para indicarle a Python que este es 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?

¿Fue útil?

Solución

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

  1. Editaste __init__.py en Windows.
  2. 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 ventana de Windows archivo).
  3. Usaste WinSCP para copiar el archivo a tu caja de Unix.
  4. WinSCP pensó: " Esto tiene algo que no es texto básico; Pondré una extensión .bin para indicar datos binarios. & Quot;
  5. El __init__.py que falta (ahora llamado __init __. py.bin ) significa que Python no entiende el kit de herramientas como un paquete.
  6. Usted crea __init__.py en el directorio apropiado y todo funciona ...?

Otros consejos

Hace

(local directory)/site-packages/toolkit

tiene un __init__.py ?

Para realizar la importación walk a través de sus directorios, cada directorio debe tener un archivo __init__.py .

En * nix, también asegúrese de que PYTHONPATH esté configurado correctamente, especialmente que tenga 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, según la versión:

 .:/usr/lib/python
 .:/usr/lib/python2.6
 .:/usr/lib/python2.7 and etc.

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 arriba el directorio donde están sus archivos. En este caso, está intentando ejecutar el archivo mountain.py e intentando llamar al módulo toolkit.interface.py , que están 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 toolkit .

2) Cuando esté en el directorio takeit , 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 el subdirectorio ramas 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 directorio toolkit ). Python ahora debería encontrar y cargar los módulos que especificó.

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

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, debe usar un editor de Linux, como vi o nano . Si usa un editor de Windows, esto escribirá algunos caracteres ocultos.

Otro problema que lo estaba afectando era que tenía otra versión de Python instalada por la raíz, así 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 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.

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

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

Usando PyCharm (parte de la suite JetBrains) necesita definir su directorio de script como Fuente:
Haz clic derecho > Marcar directorio como > Raíz de fuentes

Sí. Necesita que el directorio contenga el archivo __init__.py , que es el archivo que inicializa el paquete. Aquí, eche un vistazo a esto .

  

Los archivos __init__.py son necesarios para que Python trate los directorios como paquetes; Esto se hace para evitar que directorios con un nombre común, como 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 código de inicialización para el paquete o establecer la variable __todos__, que se describe más adelante.

  1. Debe tener el archivo __ init__.py en el mismo directorio donde está el archivo que está importando.
  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ás intentando importar un archivo foo, Python no sabrá cuál quieres.

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

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 sugirieron hacks feos de syspath (como ves, mi __init__.py estaba allí). Pues resulta que game / oblivion.py y game / oblivion eran Python confusos que escupió el inútil '' Ningún 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 paquetes tienen prioridad, pero aparentemente nuestro lanzador viola esto.

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

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 .so después de sudo setup.py install .

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

Estás leyendo esta respuesta que dice que tu __init__.py está en 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 PYTHONPATH no tenía la entrada para el directorio del proyecto. Entonces, configuré PYTHONPATH por La 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.path como:

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 buscar su proyecto.

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

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

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 en sys.path que la de su módulo.

Para depurar, diga su de foo.bar import baz quejas ImportError: ningún módulo llamado bar . Cambiando a import foo; print foo , que mostrará la ruta de foo . ¿Es lo que esperas?

Si no, cambie el nombre de foo o use importaciones absolutas .

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 " Agregar " botón, le mostrará el cuadro de diálogo "Paquetes disponibles"
  • Busque en su biblioteca, haga clic en 'Instalar paquete'
  • Entonces, todo el paquete que necesita se instalará en su carpeta personalizada 'venv' del proyecto.

 Diálogo de configuración

Disfruta.

Solucionó mi problema escribiendo print (sys.path) y descubrí que python estaba usando paquetes desactualizados a pesar de una instalación limpia. Al eliminar estos python creados, se usan automáticamente los paquetes correctos.

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.

Probar

try:
    from namespace import something 
except NameError:
    from .namespace import something

Después de sufrir el mismo problema, descubrí que mi resolución era eliminar todos los archivos pyc 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 proyecto en el explorador de Windows y buscar * .pyc , y luego seleccionar todo ( Ctrl + A ) y eliminarlos ( Ctrl + X ).

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

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

Tuve 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, buscó dentro de esta carpeta que obviamente no contenía los módulos esperados.

Tuve el mismo problema (Python 2.7 Linux), encontré la solución y me gustaría compartirla. En mi caso, tenía 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" en " folleto " y eso es. Ahora Python puede importar la clase Pregunta normalmente utilizando 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 era 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.

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ó.

Esto funcionó para mí: Se creó el archivo __init__.py dentro de la carpeta principal (en su caso, dentro de la carpeta site-packages ). E importado así:

from site-packages.toolkit.interface import interface

¡Espero que te sea útil también!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top