os.path.dirname (__ file__) retorna vazio


164

Quero obter o caminho do diretório atual no qual um arquivo .py é executado.

Por exemplo, um arquivo simples D:\test.pycom código:

import os

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

É estranho que a saída seja:

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

Eu estou esperando os mesmos resultados do getcwd()e path.dirname().

Dado os.path.abspath = os.path.dirname + os.path.basename, por que

os.path.dirname(__file__)

retorna vazio?

Respostas:


255

Porque os.path.abspath = os.path.dirname + os.path.basenamenão se sustenta. nós preferimos ter

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

Ambos dirname()e basename()apenas dividem o nome do arquivo passado em componentes sem levar em conta o diretório atual. Se você também quiser considerar o diretório atual, precisará fazê-lo explicitamente.

Para obter o nome do diretório do caminho absoluto, use

os.path.dirname(os.path.abspath(__file__))

3
Oi Sven, você está certo, deve ser os.path.dirname (os.path.abspath ( arquivo )). Obrigado! Apenas para sua informação, você recebe um pequeno erro de digitação na última linha.
Flake

11
observe que o comentário acima está em negrito, onde deve haver sublinhado nos dois lados por causa da formatação de remarcação. a resposta original foi alterada corretamente
watsonic 29/03

1
Note que nunca o temos os.path.dirname(filename) + os.path.basename(filename) == filenameporque o separador de diretórios está ausente. Nós preferimos:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Jean Paul

Estou confuso, você deve deixar basedir = os.path.abspath (os.path.dirname ( arquivo )) em seu programa? ou o que você substitui ou para onde substituir seu caminho como C: \ Users \ Test \ app.db?
0004:

@ pes04 __file__expande para o nome do arquivo atual, para que você possa usar uma cópia literal do código desta resposta.
Sven Marnach 23/10/19

9

pode ser usado também assim:

dirname(dirname(abspath(__file__)))

7
import os.path

dirname = os.path.dirname(__file__) or '.'

6
os.path.split(os.path.realpath(__file__))[0]

os.path.realpath(__file__)retornar o abspath do script atual; os.path.split (abspath) [0] retorna o diretório atual


5
print(os.path.join(os.path.dirname(__file__))) 

Você também pode usar este caminho

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.