libreria importar gestion clases archivos python importerror python-import

python - importar - Importando archivos desde diferentes carpetas



importar clases en python (21)

Así que simplemente hice clic derecho en mi IDE, agregué una nueva folder y me preguntaba por qué no podía importar desde ella. Más tarde, me di cuenta de que tenía que hacer clic derecho y crear un paquete de Python, y no una carpeta clásica del sistema de archivos. O un método post mortem que se agrega un __init__.py (lo que hace que Python trate la carpeta del sistema de archivos como un paquete) como se menciona en otras respuestas. Agregando esta respuesta aquí en caso de que alguien tomara esta ruta.

Tengo la siguiente estructura de carpetas.

application/app/folder/file.py

y quiero importar algunas funciones de file.py en otro archivo de Python que reside en

application/app2/some_folder/some_file.py

He intentado

from application.app.folder.file import func_name

y algunos otros intentos, pero hasta ahora no pude importar correctamente. ¿Cómo puedo hacer esto?


Creo que una forma ad hoc sería utilizar la variable de entorno PYTHONPATH como se describe en la documentación: Python2 , Python3

# Linux & OSX export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH # Windows set PYTHONPATH=C:/path/to/dirWithScripts/;%PYTHONPATH%


Cuando los módulos están en ubicaciones paralelas, como en la pregunta:

application/app2/some_folder/some_file.py application/app2/another_folder/another_file.py

Esta taquigrafía hace que un módulo sea visible al otro:

import sys sys.path.append(''../'')


El uso de sys.path.append con una ruta absoluta no es ideal cuando se mueve la aplicación a otros entornos. El uso de una ruta relativa no siempre funcionará porque el directorio de trabajo actual depende de cómo se invocó el script.

Dado que la estructura de carpetas de la aplicación es fija, podemos usar os.path para obtener la ruta completa del módulo que deseamos importar. Por ejemplo, si esta es la estructura:

/home/me/application/app2/some_folder/vanilla.py /home/me/application/app2/another_folder/mango.py

Y digamos que quieres importar el módulo "mango". Podrías hacer lo siguiente en vanilla.py:

import sys, os.path mango_dir = (os.path.abspath(os.path.join(os.path.dirname(__file__), ''..'')) + ''/another_folder/'') sys.path.append(mango_dir) import mango

Por supuesto, no necesitas la variable mango_dir.

Para entender cómo funciona esto, mira este ejemplo de sesión interactiva:

>>> import os >>> mydir = ''/home/me/application/app2/some_folder'' >>> newdir = os.path.abspath(os.path.join(mydir, ''..'')) >>> newdir ''/home/me/application/app2'' >>> newdir = os.path.abspath(os.path.join(mydir, ''..'')) + ''/another_folder'' >>> >>> newdir ''/home/me/application/app2/another_folder'' >>>

Y compruebe la documentación de os.path .


En Python 3.4 y versiones posteriores, puede importar desde un archivo fuente directamente (enlace a la documentación) .

Aquí hay un ejemplo. Primero, el archivo a importar, llamado foo.py :

def announce(): print("Imported!")

El código que importa el archivo anterior, inspirado en gran medida en el ejemplo de la documentación:

import importlib, importlib.util, os.path def module_from_file(module_name, file_path): spec = importlib.util.spec_from_file_location(module_name, file_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module foo = module_from_file("foo", "/path/to/foo.py") if __name__ == "__main__": print(foo) print(dir(foo)) foo.announce()

La salida:

<module ''foo'' from ''/path/to/foo.py''> [''__builtins__'', ''__cached__'', ''__doc__'', ''__file__'', ''__loader__'', ''__name__'', ''__package__'', ''__spec__'', ''announce''] Imported!

Tenga en cuenta que el nombre de la variable, el nombre del módulo y el nombre de archivo no tienen que coincidir. Este código todavía funciona:

import importlib, importlib.util, os.path def module_from_file(module_name, file_path): spec = importlib.util.spec_from_file_location(module_name, file_path) module = importlib.util.module_from_spec(spec) spec.loader.exec_module(module) return module baz = module_from_file("bar", "/path/to/foo.py") if __name__ == "__main__": print(baz) print(dir(baz)) baz.announce()

La salida:

<module ''bar'' from ''/path/to/foo.py''> [''__builtins__'', ''__cached__'', ''__doc__'', ''__file__'', ''__loader__'', ''__name__'', ''__package__'', ''__spec__'', ''announce''] Imported!

La importación programática de módulos se introdujo en Python 3.1 y le da más control sobre cómo se importan los módulos. Consulte la documentación para más información.


En mi caso tuve una clase para importar. Mi archivo se veía así:

# /opt/path/to/code/log_helper.py class LogHelper: # stuff here

En mi archivo principal incluí el código a través de:

path.append("/opt/path/to/code/") from log_helper import LogHelper


Esto me funciona en windows

# some_file.py on mainApp/app2 import sys sys.path.insert(0, sys.path[0]+''//app2'') import some_file


Me enfrenté al mismo desafío, especialmente al importar múltiples archivos, así es como logré superarlo.

import os, sys from os.path import dirname, join, abspath sys.path.insert(0, abspath(join(dirname(__file__), ''..''))) from root_folder import file_name


No hay nada malo con:

from application.app.folder.file import func_name

Solo asegúrese de que la carpeta también contenga un __init__.py , esto permite que se incluya como un paquete. No estoy seguro de por qué las otras respuestas hablan de PYTHONPATH.


Por defecto, no puedes. Al importar un archivo, Python solo busca el directorio actual, el directorio desde el que se ejecuta el script de punto de entrada y sys.path que incluye ubicaciones como el directorio de instalación del paquete (en realidad es un poco más complejo que esto, pero esto cubre mayoria de los casos).

Sin embargo, puede agregar a la ruta de Python en tiempo de ejecución:

# some_file.py import sys sys.path.insert(0, ''/path/to/application/app/folder'') import file


Por lo que sé, agregue un archivo __init__.py directamente en la carpeta de las funciones que desea importar para hacer el trabajo.


Pruebe las importaciones relativas de Python:

from ...app.folder.file import func_name

Cada punto inicial es otro nivel superior en la jerarquía que comienza con el directorio actual.

¿Problemas? Si esto no está funcionando para usted, entonces es probable que le estén molestando las muchas importaciones relativas de Gotcha. Lea las respuestas y los comentarios para obtener más detalles: Cómo corregir "Intento de importación relativa en un no paquete" incluso con __init__.py

Sugerencia: tenga __init__.py en cada nivel de directorio. Es posible que necesite python -m application.app2.some_folder.some_file (dejando fuera .py) que ejecuta desde el directorio de nivel superior o tiene ese directorio de nivel superior en su PYTHONPATH. ¡Uf!


Puede actualizar el shell de Python presionando f5, o vaya a Ejecutar-> Ejecutar módulo. De esta manera no tiene que cambiar el directorio para leer algo del archivo. Python cambiará automáticamente el directorio. Pero si desea trabajar con diferentes archivos de diferentes directorios en el Python Shell, entonces puede cambiar el directorio en sys, como dijo Cameron anteriormente.


Si el propósito de cargar un módulo desde una ruta específica es ayudarlo durante el desarrollo de un módulo personalizado, puede crear un enlace simbólico en la misma carpeta del script de prueba que apunta a la raíz del módulo personalizado. Esta referencia del módulo tendrá prioridad sobre cualquier otro módulo instalado con el mismo nombre para cualquier script que se ejecute en esa carpeta.

Probé esto en Linux pero debería funcionar en cualquier sistema operativo moderno que admita enlaces simbólicos.

Una ventaja de este enfoque es que puede apuntar a un módulo que se encuentra en su propia copia de trabajo local de la sucursal de SVC, lo que puede simplificar enormemente el tiempo del ciclo de desarrollo y reducir los modos de falla de la administración de diferentes versiones del módulo.


Soy bastante especial: ¡uso Python con Windows!

Acabo de completar la información: tanto para Windows como para Linux, tanto la ruta relativa como la absoluta funcionan en sys.path (necesito rutas relativas porque uso mis scripts en varias PC y en diferentes directorios principales).

Y cuando use Windows, tanto / como / puede usarse como separador para nombres de archivos y, por supuesto, debe duplicar / en cadenas de Python,
algunos ejemplos válidos:

sys.path.append(''c://tools//mydir'') sys.path.append(''..//mytools'') sys.path.append(''c:/tools/mydir'') sys.path.append(''../mytools'')

(nota: creo que / es más conveniente que / , evento si es menos ''nativo de Windows'' porque es compatible con Linux y es más sencillo de escribir y copiar en el explorador de Windows)


Su problema es que Python está buscando en el directorio de Python este archivo y no lo encuentra. Debe especificar que está hablando del directorio en el que se encuentra y no del directorio de Python.

Para hacer esto cambias esto:

from application.app.folder.file import func_name

a esto:

from .application.app.folder.file import func_name

Al agregar el punto que está diciendo, busque en esta carpeta la carpeta de la aplicación en lugar de buscar en el directorio de Python.


Teniendo en cuenta la application como el directorio raíz de su proyecto de Python, cree un archivo __init__.py vacío en las __init__.py de application , app y carpetas. Luego, en su some_file.py realice los cambios siguientes para obtener la definición de func_name:

import sys sys.path.insert(0, r''/from/root/directory/application'') from application.app.folder.file import func_name ## You can also use ''*'' wildcard to import all the functions in file.py file. func_name()


Trabajó para mí en python3 en linux

import sys sys.path.append(pathToFolderContainingScripts) from scriptName import functionName #scriptName without .py extension


Las respuestas aquí carecen de claridad, esto se prueba en Python 3.6

Con esta estructura de carpetas:

main.py | ---- myfolder/myfile.py

Donde myfile.py tiene el contenido:

def myfunc(): print(''hello'')

La declaración de importación en main.py es:

from myfolder.myfile import myfunc myfunc()

y esto te imprimirá hola .


Primer sistema de importación

import sys

Segundo agregar la ruta de la carpeta

sys.path.insert(0, ''/the/folder/path/name-folder/'')

Tercero Haz un archivo en blanco llamado __ init __.py en tu subdirectorio (esto le dice a Python que es un módulo)

  • nombre.archivo.py
    • carpeta de nombres
      • __ inicia __.py
      • nombre-módulo.py

Cuarta importación del módulo dentro de la carpeta.

from name-folder import name-module


sys.path.insert(0, ''/path/to/application/app/folder'')