Pregunta Importar archivos de una carpeta diferente


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 diferentes, pero hasta ahora no he podido importar correctamente. ¿Cómo puedo hacer esto?


697
2017-12-08 02:07


origen


Respuestas:


Por defecto, no puedes. Al importar un archivo, Python solo busca en el directorio actual, el directorio desde el cual 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 la mayoría 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

815
2017-12-08 02:12



Nada malo con:

from application.app.folder.file import func_name

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


402
2018-02-24 18:27



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 para el otro:

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

42
2017-11-15 14:55



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

export PYTHONPATH=$HOME/dirWithScripts/:$PYTHONPATH
# Windows users: use "set" instead of "export"

28
2018-02-19 11:00



Por lo que sé, agrega un __init__.py archivo directamente en la carpeta de las funciones que desea importar hará el trabajo.


21
2017-11-24 04:31



Considerando application como el directorio raíz de tu proyecto python, crea un espacio vacío __init__.py presentar en application, app y folder carpetas. Entonces en tu some_file.py realice los cambios de la siguiente manera 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()

16
2017-10-15 08:34



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

Con esta estructura de carpetas:

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

Dónde 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 se imprimirá Hola.


13
2018-02-19 03:22



Trabajó para mí en python3 en Linux

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

12
2017-08-16 15:24