os.path.dirname (__ файл__) повертається порожнім


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()лише розділити ім'я файлу, що передається, на компоненти, не враховуючи поточний каталог. Якщо ви також хочете розглянути поточний каталог, ви повинні зробити це явно.

Щоб отримати dirname абсолютного шляху, використовуйте

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

3
Привіт, Свен, ти маєш рацію, це має бути os.path.dirname (os.path.abspath ( файл )). Дякую! Тільки FYI, ви отримуєте невелику друкарську помилку в останньому рядку.
Пластівці

11
зауважте, що вищевказаний коментар має жирне місце, де слід підкреслити обидві сторони через форматування розмітки. оригінальну відповідь було змінено правильно
watsonic

1
Зауважте, що у нас ніколи немає, os.path.dirname(filename) + os.path.basename(filename) == filenameоскільки відсутній роздільник каталогів. Ми швидше маємо:os.path.join(os.path.dirname(filename), os.path.basename(filename)) == filename
Жан Пол

Я розгублений, ви повинні залишити в програмі osnovair = os.path.abspath (os.path.dirname ( файл ))? або що ви замінюєте або де замінюєте свій шлях, наприклад, C: \ Users \ Test \ app.db?
0004

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



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

os.path.realpath(__file__)повернути невідповідність поточному сценарію; os.path.split (abspath) [0] повернути поточний dir


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

Ви також можете використовувати цей спосіб

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.