non - python import module from path
Leyendo el archivo usando la ruta relativa en el proyecto python (1)
Digamos que tengo un proyecto de python que está estructurado de la siguiente manera:
project
/data
test.csv
/package
__init__.py
module.py
main.py
__init__.py
:
from .module import test
module.py
:
import csv
with open("..data/test.csv") as f:
test = [line for line in csv.reader(f)]
main.py
:
import package
print(package.test)
Cuando ejecuto main.py
me sale el siguiente error:
C:/Users/Patrick/Desktop/project>python main.py
Traceback (most recent call last):
File "main.py", line 1, in <module>
import package
File "C:/Users/Patrick/Desktop/project/package/__init__.py", line 1, in <module>
from .module import test
File "C:/Users/Patrick/Desktop/project/package/module.py", line 3, in <module>
with open("../data/test.csv") as f:
FileNotFoundError: [Errno 2] No such file or directory: ''../data/test.csv''
Sin embargo, si ejecuto module.py
desde el directorio del package
, no obtengo errores. Entonces, parece que la ruta relativa utilizada en open(...)
es solo relativa a la __name__ == "__main__"
desde la que se está ejecutando el archivo de origen (es decir, __name__ == "__main__"
)? No quiero usar caminos absolutos. ¿Cuáles son algunas maneras de lidiar con esto?
Las rutas relativas son relativas al directorio de trabajo actual . Si no quieres que tu camino sea, debe ser absoluto.
Pero hay un truco de uso frecuente para construir una ruta absoluta desde el script actual: use su __file__
especial __file__
:
import csv
import os.path
my_path = os.path.abspath(os.path.dirname(__file__))
path = os.path.join(my_path, "../data/test.csv")
with open(path) as f:
test = list(csv.reader(f))
Tenga en cuenta que, desde Python 3.4, __file__
siempre es absoluto para los módulos importados y puede eliminar la parte os.path.abspath
en este ejemplo. No es que sea estrictamente necesario, pero evita sorpresas si cambia el directorio de trabajo actual en algún momento y su módulo se importó utilizando una ruta relativa.