Я спробую також вирішити кілька варіантів цього питання:
- знаходження шляху викликаного сценарію
- знаходження шляху поточного сценарію виконання
- знаходження каталогу викликаного сценарію
(Деякі з цих запитань були задані на SO, але вони були закриті як дублікати та перенаправлені тут.)
Застереження використання __file__
Для імпортного модуля:
import something
something.__file__
поверне абсолютний шлях модуля. Однак, враховуючи наступний сценарій foo.py:
#foo.py
print '__file__', __file__
Викликаючи його за допомогою "python foo.py", повернеться просто "foo.py". Якщо ви додасте шебанг:
#!/usr/bin/python
#foo.py
print '__file__', __file__
і зателефонуйте за допомогою ./foo.py, він повернеться './foo.py'. Викликаючи його з іншого каталогу (наприклад, покладіть foo.py в рядок каталогів), а потім зателефонувавши будь-якому
python bar/foo.py
або додавши шебанг і безпосередньо виконайте файл:
bar/foo.py
поверне 'bar / foo.py' ( відносний шлях).
Пошук каталогу
Тепер поїхати звідти отримати каталог, os.path.dirname(__file__)
також може бути складним. Принаймні в моїй системі він повертає порожню рядок, якщо ви викликаєте її з того самого каталогу, що і файл. колишній
# foo.py
import os
print '__file__ is:', __file__
print 'os.path.dirname(__file__) is:', os.path.dirname(__file__)
виведе:
__file__ is: foo.py
os.path.dirname(__file__) is:
Іншими словами, він повертає порожній рядок, тому це не здається надійним, якщо ви хочете використовувати його для поточного файлу (на відміну від файлу імпортованого модуля). Щоб обійти це, ви можете ввімкнути це у заклик до відмови:
# foo.py
import os
print 'os.path.abspath(__file__) is:', os.path.abspath(__file__)
print 'os.path.dirname(os.path.abspath(__file__)) is:', os.path.dirname(os.path.abspath(__file__))
який виводить щось на кшталт:
os.path.abspath(__file__) is: /home/user/bar/foo.py
os.path.dirname(os.path.abspath(__file__)) is: /home/user/bar
Зауважте, що abspath () НЕ вирішує символьні посилання. Якщо ви хочете це зробити, використовуйте натомість realpath (). Наприклад, створення файлу symlink file_import_testing_link, що вказує на file_import_testing.py, із таким вмістом:
import os
print 'abspath(__file__)',os.path.abspath(__file__)
print 'realpath(__file__)',os.path.realpath(__file__)
виконання буде надрукувати абсолютні контури приблизно:
abspath(__file__) /home/user/file_test_link
realpath(__file__) /home/user/file_test.py
file_import_testing_link -> file_import_testing.py
Використовуючи перевірку
@SummerBreeze згадує, використовуючи модуль перевірки .
Це, здається, працює добре і досить стисло для імпортних модулів:
import os
import inspect
print 'inspect.getfile(os) is:', inspect.getfile(os)
слухняно повертає абсолютний шлях. Однак для пошуку шляху поточного сценарію виконання я не бачив способу його використання.