os.path.dirname (__ file__) devuelve vacío

165

Quiero obtener la ruta del directorio actual en el que se ejecuta un archivo .py.

Por ejemplo, un archivo simple D:\test.pycon código:

import os

print os.getcwd()
print os.path.basename(__file__)
print os.path.abspath(__file__)
print os.path.dirname(__file__)

Es extraño que la salida sea:

D:\
test.py
D:\test.py
EMPTY

Espero los mismos resultados de getcwd()y path.dirname().

Dado os.path.abspath = os.path.dirname + os.path.basename, por qué

os.path.dirname(__file__)

vuelve vacío?

Escama
fuente

Respuestas:

257

Porque os.path.abspath = os.path.dirname + os.path.basenameno aguanta. preferimos tener

os.path.dirname(filename) + os.path.basename(filename) == filename

Ambos dirname()y basename()solo dividen el nombre del archivo pasado en componentes sin tener en cuenta el directorio actual. Si también desea considerar el directorio actual, debe hacerlo explícitamente.

Para obtener el nombre de directorio de la ruta absoluta, use

os.path.dirname(os.path.abspath(__file__))
Sven Marnach
fuente
3
Hola Sven, tienes razón, debería ser os.path.dirname (os.path.abspath ( archivo )). ¡Gracias! Solo para tu información, obtienes un pequeño error tipográfico en la última línea.
Flake
11
tenga en cuenta que el comentario anterior tiene un negrita donde debería haber subrayado en ambos lados debido al formato de rebajas. la respuesta original se cambió correctamente
watsonic
1
Tenga en cuenta que nunca tenemos os.path.dirname(filename) + os.path.basename(filename) == filenameporque falta el separador de directorio. Preferimos:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Jean Paul el
Estoy confundido, ¿debería dejar basedir = os.path.abspath (os.path.dirname ( file )) en su programa? o qué reemplazas o dónde reemplazas tu ruta como C: \ Users \ Test \ app.db?
0004
@ pes04 se __file__expande al nombre del archivo actual, por lo que puede usar una copia literal del código de esta respuesta.
Sven Marnach
9

se puede usar también así:

dirname(dirname(abspath(__file__)))
adnan dogar
fuente
7
import os.path

dirname = os.path.dirname(__file__) or '.'
Deve
fuente
6
os.path.split(os.path.realpath(__file__))[0]

os.path.realpath(__file__)devuelve el abspath del script actual; os.path.split (abspath) [0] devuelve el directorio actual

RY Zheng
fuente
5
print(os.path.join(os.path.dirname(__file__))) 

También puedes usar de esta manera

Mikhail
fuente