Solía abrir archivos que estaban en el mismo directorio que el script de Python actualmente en ejecución simplemente usando un comando como
open("Some file.txt", "r")
Sin embargo, descubrí que cuando el script se ejecutaba en Windows haciendo doble clic en él, intentaba abrir el archivo desde el directorio incorrecto.
Desde entonces he usado un comando de la forma
open(os.path.join(sys.path[0], "Some file.txt"), "r")
cada vez que quería abrir un archivo. Esto funciona para mi uso particular, pero no estoy seguro de si sys.path[0]
podría fallar en algún otro caso de uso.
Entonces mi pregunta es: ¿Cuál es la mejor y más confiable forma de abrir un archivo que se encuentra en el mismo directorio que el script Python actualmente en ejecución?
Esto es lo que he podido descubrir hasta ahora:
os.getcwd()
yos.path.abspath('')
devuelve el "directorio de trabajo actual", no el directorio del script.os.path.dirname(sys.argv[0])
yos.path.dirname(__file__)
devuelve la ruta utilizada para llamar al script, que puede ser relativa o incluso en blanco (si el script está en el cwd). Además,__file__
no existe cuando el script se ejecuta en IDLE o PythonWin.sys.path[0]
yos.path.abspath(os.path.dirname(sys.argv[0]))
parece que devuelve el directorio del script. No estoy seguro de si hay alguna diferencia entre estos dos.
Editar:
Me acabo de dar cuenta de que lo que quiero hacer se describirá mejor como "abrir un archivo en el mismo directorio que el módulo contenedor". En otras palabras, si importo un módulo que escribí que está en otro directorio, y ese módulo abre un archivo, quiero que busque el archivo en el directorio del módulo. No creo que nada de lo que he encontrado sea capaz de hacer eso ...
__file__
no se puede usar, use ensys.argv[0]
lugar dedirname(__file__)
. El resto debería funcionar como se esperaba. Me gusta usarlo__file__
porque en el código de la biblioteca, essys.argv[0]
posible que no apunte a su código, especialmente si se importa a través de un script de terceros.