Python no puede encontrar el módulo en la misma carpeta

98

Mi python de alguna manera no puede encontrar ningún módulo en el mismo directorio. ¿Qué estoy haciendo mal? (python2.7)

Entonces tengo un directorio '2014_07_13_test', con dos archivos en él:

  1. test.py
  2. hola.py

donde hello.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

def hello1():
    print 'HelloWorld!'

y test.py:

# !/usr/local/bin/python
# -*- coding: utf-8 -*-

from hello import hello1

hello1()

Todavía Python me da

>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<string>", line 4, in <module>
ImportError: No module named hello

¿Qué pasa?

Philipp_Kats
fuente
2
¿Cómo estás ejecutando el guión? También cuál es la salida deimport sys; sys.path
Salem
1
Prueba>>> import test
martineau
@Casy_fill ¿Ejecuta su programa desde el directorio, dónde están los archivos? Para importar, no importa, que los archivos importados y los importados compartan un directorio. Es importante que su intérprete de Python tenga el directorio actual configurado correctamente.
Jan Vlcinsky

Respuestas:

80

Su código está bien, sospecho que su problema es cómo lo está iniciando.

Debe iniciar Python desde su directorio '2014_07_13_test'.

Abra un símbolo del sistema y 'cd' en su directorio '2014_07_13_test'.

Por ejemplo:

$ cd /path/to/2014_07_13_test
$ python test.py

Si no puede 'cd' en el directorio como este, puede agregarlo a sys.path

En test.py:

import sys, os
sys.path.append('/path/to/2014_07_13_test')

O configurar / editar el PYTHONPATH

Y todo debería estar bien ...

... bueno, hay un pequeño error con sus líneas 'shebang' (la primera línea en ambos archivos), no debería haber un espacio entre el '#' y el '!'

Hay un mejor shebang que deberías usar.

Además, no necesita la línea shebang en cada archivo ... solo los que pretende ejecutar desde su shell como archivos ejecutables.

Jeremy Allen
fuente
muchas gracias, que el problema! Desafortunadamente, SublimeRepl (que yo uso) no admite el inicio de Python desde la carpeta en este momento, por lo que parece que necesito exportar PATH ahora
Philipp_Kats
Lectores posteriores, por favor, lean hasta el final de la página para ver otras respuestas muy útiles, por ejemplo, la de jfn sobre importaciones relativas .
HongboZhu
Sí, este era mi problema. Tenía una gran carpeta de proyectos de práctica de Python abierta en VS Code y estaba teniendo grandes problemas para encontrar cosas en el mismo directorio. Mi problema era que, en la terminal, no había cambiado de directorio al subdirectorio en el que tenía mi proyecto actual. Una vez que hice eso, el problema se resolvió.
Matt West
105

Cambie su importación en test.py a:

from .hello import hello1
jfn
fuente
23
Si alguien más encuentra esto más tarde, esto se llama importaciones relativas y se agregó en python 2.5: docs.python.org/2.5/whatsnew/pep-328.html
sgfit
9
Para importar el uso del módulo completofrom . import hello
ST7
Creo que esta es una mejor solución que la mejor respuesta aceptada. Utilizo toda la importación del módulo, como señaló ST7:from . import local_module
Gene M
25

Tuve un problema similar, lo resolví agregando explícitamente el directorio del archivo a la lista de rutas:

import os
import sys

file_dir = os.path.dirname(__file__)
sys.path.append(file_dir)

Después de eso, no tuve problemas para importar desde el mismo directorio.

ecotner
fuente
2
Si bien esto funcionó, la respuesta de jwn usando importaciones relativas fue una solución mucho más limpia.
Russ Schultz
16

Aquí está la solución genérica que utilizo. Resuelve el problema de importar desde módulos en la misma carpeta:

import os.path
import sys
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))

Pon esto en la parte superior del módulo que da el error "Ningún módulo llamado xxxx"

apadana
fuente
1
Esto me ayudó a cargar el módulo desde el directorio principal, reemplazando ".." con "../ ..". ¡Muchas gracias!
Nikola R.
1
es el nombre del archivo que se va a importar o el módulo actual donde estamos importando el módulo o es constante
Manoj
9

En mi caso, Python no pudo encontrarlo porque puse el código dentro de un módulo con guiones, por ejemplo my-module. Cuando lo cambié my_modulefuncionó.

Chris Claxton
fuente
1

Me encontré con este problema. Tenía tres carpetas en el mismo directorio, así que tuve que especificar qué carpeta. Ej: desde el script de importación de carpetas

Nippon87
fuente
0

Lo siguiente no resuelve el problema del OP, pero el título y el error es exactamente lo que enfrenté.

Si su proyecto tiene un setup.pyscript, puede instalar ese paquete en el que se encuentra, con python3 -m pip install -e .o python3 setup.py installo python3 setup.py develop, y este paquete se instalará, pero seguirá siendo editable (por lo que los cambios en el código se verán al importar el paquete). Si no tiene un setup.py, dale sentido .

De todos modos, ¿parece que el problema que enfrenta OP ya no existe?

archivo one.py:

def function():
    print("output")

archivo two.py:

#!/usr/bin/env python3

import one
one.function()
chmod +x two.py # To allow execution of the python file
./two.py # Only works if you have a python shebang

Command line output: output

Otras soluciones parecen 'sucias'

En el caso de OP con 2 archivos de prueba, modificarlos para que funcionen probablemente esté bien. Sin embargo, en otros escenarios reales, los métodos enumerados en las otras respuestas probablemente no se recomiendan. Requieren que modifique el código Python o restrinja su flexibilidad (ejecutando el archivo Python desde un directorio específico) y generalmente presentan molestias. ¿Qué pasa si acaba de clonar un proyecto y esto sucede? Probablemente ya funcione para otras personas y no es necesario realizar cambios en el código. La respuesta elegida también quiere que las personas ejecuten un script desde una carpeta específica para que funcione. Esto puede ser una fuente de molestias a largo plazo, lo que nunca es bueno. También sugiere agregar su carpeta de Python específica a PATH (se puede hacer a través de Python o la línea de comandos). Nuevamente, ¿qué sucede si cambia el nombre o mueve la carpeta en unos meses? Tienes que buscar esta página de nuevo, y, finalmente, descubre que necesita establecer la ruta (y que hizo exactamente esto hace unos meses), y que simplemente necesita actualizar una ruta (seguro que puede usar sys.path y configurarlo programáticamente, pero esto puede ser inestable ). Muchas fuentes de gran molestia.

Ben Butterworth
fuente
0

Si está seguro de que todos los módulos, los archivos que está intentando importar están en la misma carpeta y deben seleccionarse directamente con solo dar el nombre y no la ruta de referencia, entonces su editor o terminal debería haber abierto la carpeta principal donde todos los archivos / módulos están presentes.

O bien, intente ejecutar desde Terminal, asegúrese primero de ir al directorio correcto.

discos compactos path to the root folder where all the modules are

pitón script.py

O si ejecuta [F5] desde el editor, es decir, VsCode, abra allí la carpeta completa y no los archivos individuales.

Iqra.
fuente