os.path.dirname (__ file__) возвращает пустое


165

Я хочу получить путь к текущему каталогу, в котором выполняется файл .py.

Например, простой файл D:\test.pyс кодом:

import os

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

Странно, что вывод:

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

Я ожидаю таких же результатов от getcwd()и path.dirname().

Учитывая os.path.abspath = os.path.dirname + os.path.basename, почему

os.path.dirname(__file__)

возвращается пустой?

Ответы:


257

Потому os.path.abspath = os.path.dirname + os.path.basenameчто не держит. у нас скорее есть

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

Оба dirname()и basename()только разделяют переданное имя файла на компоненты без учета текущего каталога. Если вы хотите также рассмотреть текущий каталог, вы должны сделать это явно.

Чтобы получить имя абсолютного пути, используйте

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

3
Привет Свен, вы правы, это должно быть os.path.dirname (os.path.abspath ( file )). Спасибо! Просто к вашему сведению, вы получите небольшую опечатку в последней строке.
Flake

11
обратите внимание, что вышеупомянутый комментарий выделен жирным шрифтом, где с обеих сторон должно быть подчеркивание из-за форматирования уценки оригинальный ответ был изменен правильно
watsonic

1
Обратите внимание, что мы никогда не имеем, os.path.dirname(filename) + os.path.basename(filename) == filenameпотому что разделитель каталогов отсутствует. У нас скорее есть:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Жан Поль

Я в замешательстве, вы должны оставить basedir = os.path.abspath (os.path.dirname ( file )) в вашей программе? или что вы заменяете или где вам заменить ваш путь, например C: \ Users \ Test \ app.db?
0004

@ pes04 __file__расширяется до имени текущего файла, поэтому вы можете использовать дословную копию кода из этого ответа.
Свен Марнач



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

os.path.realpath(__file__)вернуть abspath текущего скрипта; os.path.split (abspath) [0] возвращает текущий каталог


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

Вы также можете использовать этот способ

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.