Soy Eloy! Data Scientist de profesión y game designer de hobbie.
Me entere de este espacio gracias a una consulta a un Prof. y se las transfiero, estoy creando mi primer package en python el cual es un framework para data pipelines (Normandy), la idea básica hasta ahora funciona, sin embargo cuando se requieren usar funciones definidas por el usuario no logro poder cargarlas a pesar de estar en el mismo path, y con el __init__ definido.
Aclaro un poco más:
Tengo esta estructura de carpetas:
test_project/
pipeline/
read/
read_process.py
process/
data_process.py
pipeline_conf.yml
tools/
functions.py
__init__.py
Siendo test_project el path principal de mi proyecto.
Dentro de data_process tengo:
from tools.functions import test_function
Lo cual me devuelve un error de que no se consigue el modulo “tools”. Verifique y estoy en el nivel de test_project/.
Pueden ayudarme con este tema?
Quedo atento a cualquier comentario e información extra que necesiten.
Hola Eloy!
según veo el problema está en que functions.py está algunos niveles “antes” que data_process.py.
Fijate:
pipeline → process → data_process.py
tiene que hacer este camino:
← pipeline ← test_project
→ tools → functions.py
(espero se entienda lo de las flechitas)
Para que te funcione el import tal cual está, deberías mover data_process.py a test_project/ y ahí si lo vas a importar sin problemas. Hacé la prueba
Ahora bien, ¿cómo resolver de la mejor manera esto respetando la estructura de carpetas? Se lo dejo a los que sepan un poco más jej
Muchas gracias por tu respuesta, sin embargo ese no es el problema, también lo pensé y de hecho probé colocando la carpeta tools dentro de la carpeta process pero de igual manera no funciono.
Explico un poco más sobre el packete Normandy, el mismo se ejecuta desde el directorio base (en este caso en test_project/) usando el comando
normandy --run-pipeline -tags foo
Luego, egún la configuración del pipeline_conf.yml y los tags que se coloquen, carga de cada archivo dentro de las sub carpetas en pipeline (En este caso serian read/ y process/) una función llamada process.
Coloco el link al repositorio del proyecto en caso de que quieras revisarlo más a fondo.
Logre solventar el problema usando spec_from_file_location, module_from_spec de importlib. Por alguna razón era necesario colocar el path completo, para esto cree una clase que sirva de interfaz con el usuario para poder usar sus modulos, la misma la pueden ver aqui.
Definitivamente es algo que se puede mejorar por lo que cualquier sugerencia es bien recibida.