top non from beyond attempted another python python-3.x io relative-path python-import

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.