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__расширяется до имени текущего файла, поэтому вы можете использовать дословную копию кода из этого ответа.
Свен Марнач
9

можно использовать также так:

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__)вернуть abspath текущего скрипта; os.path.split (abspath) [0] возвращает текущий каталог

Р.Ю. Чжэн
источник
5
print(os.path.join(os.path.dirname(__file__))) 

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

Михаил
источник