Ответ 1
# in /a/b/c/d/e/file.py
import os
os.path.dirname(os.path.abspath(__file__)) # /a/b/c/d/e
Скажем, что у меня есть файл python в каталоге e:
/a/b/c/d/e/file.py
В каталоге e У меня есть несколько папок, к которым я хочу получить доступ, но если файл .py выполняется из любого места, а не из папки e, относительный путь не будет работа для меня. Также папка e может быть расположена где угодно, но всегда с набором подпапок, поэтому абсолютный путь не будет работать.
Во-первых, есть ли какая-либо функция для получения абсолютного пути относительно расположения исходных файлов?
Если нет, какие-нибудь идеи, как разобраться в этом? Захватите используемую командную строку и добавьте CWD вместе?
Моя проблема заключается в том, что эта папка устанавливается на 20 разных машинах и ОС, и я хочу, чтобы она была настолько динамичной, насколько это возможно, с небольшими конфигурациями и "правилами", где она должна быть установлена и т.д.
# in /a/b/c/d/e/file.py
import os
os.path.dirname(os.path.abspath(__file__)) # /a/b/c/d/e
Вот мое решение, которое (a) получает .py файл, а не файл .pyc, и (b) сортирует символические ссылки.
Работая с Linux, файлы .py
часто привязываются к другому месту, а файлы .pyc
генерируются в каталоге рядом с файлами с символическими выводами. Чтобы найти реальный путь исходного файла, вот часть script, которую я использую, чтобы найти исходный путь.
try:
modpath = module.__file__
except AttributeError:
sys.exit('Module does not have __file__ defined.')
# It a script for me, you probably won't want to wrap it in try..except
# Turn pyc files into py files if we can
if modpath.endswith('.pyc') and os.path.exists(modpath[:-1]):
modpath = modpath[:-1]
# Sort out symlinks
modpath = os.path.realpath(modpath)