2012-04-16 15 views
23

Digamos que tiene un módulo que contienehacer una ruta de archivo "siempre relativa al módulo actual"?

myfile = open('test.txt', 'r') 

y el archivo 'test.txt' está en la misma carpeta. Si ejecuta el módulo, el archivo se abrirá correctamente. Ahora digamos que importa ese módulo de otro que está en otra carpeta. El archivo no se buscará en la misma carpeta que el módulo donde está el código. Entonces, ¿cómo hacer primero que el módulo busque archivos con rutas relativas en la misma carpeta? Existen varias soluciones al usar "__file__" o "os.getcwd()", pero espero que haya una manera más limpia, como el mismo carácter especial en la cadena que pasa a abrir() o file().

+0

Cuál es el problema con 'os.getcwd()'? – cfedermann

+1

'os.getcwd()' devuelve la ruta del primer módulo, que importó ese módulo, o importó otro que lo importó. El primer módulo puede estar en muchos directorios hacia arriba o hacia abajo. Por lo tanto, no parece muy elegante escribir 'os.getcwd() + 'something/eventhingelse/yetanother/finallyhere'' –

+1

Bueno, entonces pruebe la respuesta' sys.modules' propuesta abajo :) – cfedermann

Respuesta

31

La solución es utilizar __file__ y es bastante limpio:

import os 

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt') 
+0

+1, de hecho! Incluso puede simplemente 'importar os.path'. – Emmanuel

+0

'import os.path' no tiene sentido, cuando usted hace' import os', el módulo importa 'os.path' por usted (' os' es especial de esa manera). Se podría usar 'from os import path' pero no es común en el caso del módulo' os'. Es muy probable que ya tenga 'import os' en su módulo o que lo necesite pronto. Por lo tanto, 'import os' es casi siempre la mejor opción. – yak

+0

Supongo que esto es lo más limpio que se puede obtener. Algo más sería pedir cambiar la forma en que funciona el intérprete oficial de Python. –

Cuestiones relacionadas