Найти путь к текущему файлу

Как я могу найти полный путь к текущему скрипту Python? То есть, что я должен сделать, чтобы добиться этого:

Nirvana@bahamut:/tmp$ python baz.py
running from /tmp 
file is baz.py

8 ответов

Решение

__file__это не то, что вы ищете. Не используйте случайные побочные эффекты

sys.argv[0] всегда путь к сценарию (если на самом деле был вызван сценарий) - см. http://docs.python.org/library/sys.html

__file__ путь к текущему исполняемому файлу (скрипт или модуль). Это случайно совпадает со сценарием, если к нему обращаются из сценария! Если вы хотите поместить в библиотеку полезные вещи, такие как поиск файлов ресурсов относительно расположения скрипта, вы должны использовать sys.argv[0],

Пример:

C:\junk\so>type \junk\so\scriptpath\script1.py
import sys, os
print "script: sys.argv[0] is", repr(sys.argv[0])
print "script: __file__ is", repr(__file__)
print "script: cwd is", repr(os.getcwd())
import whereutils
whereutils.show_where()

C:\junk\so>type \python26\lib\site-packages\whereutils.py
import sys, os
def show_where():
    print "show_where: sys.argv[0] is", repr(sys.argv[0])
    print "show_where: __file__ is", repr(__file__)
    print "show_where: cwd is", repr(os.getcwd())

C:\junk\so>\python26\python scriptpath\script1.py
script: sys.argv[0] is 'scriptpath\\script1.py'
script: __file__ is 'scriptpath\\script1.py'
script: cwd is 'C:\\junk\\so'
show_where: sys.argv[0] is 'scriptpath\\script1.py'
show_where: __file__ is 'C:\\python26\\lib\\site-packages\\whereutils.pyc'
show_where: cwd is 'C:\\junk\\so'

Это выведет каталог, в котором находится скрипт (в отличие от рабочего каталога):

import os
dirname, filename = os.path.split(os.path.abspath(__file__))
print "running from", dirname
print "file is", filename

Вот как это ведет себя, когда я положил его в c:\src:

> cd c:\src
> python so-where.py
running from C:\src
file is so-where.py

> cd c:\
> python src\so-where.py
running from C:\src
file is so-where.py
import sys, os

file = sys.argv[0]
pathname = os.path.dirname(file)
print 'running from %s' % os.path.abspath(pathname)
print 'file is %s' % file

Проверьте os.getcwd() ( документы)

Запущенный файл всегда __file__,

Вот демонстрационный скрипт, названный identify.py

print __file__

Вот результаты

MacBook-5:Projects slott$ python Stackru/identify.py 
Stackru/identify.py
MacBook-5:Projects slott$ cd Stackru/
MacBook-5:Stackru slott$ python identify.py 
identify.py

Я бы предложил

import os, sys
print os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0]

Таким образом, вы можете безопасно создавать символические ссылки на исполняемый файл скрипта, и он все равно найдет правильный каталог.

Имя скрипта будет (всегда?) Первым индексом sys.argv:

import sys
print sys.argv[0]

Еще более простой способ найти путь к исполняемому скрипту:

os.path.dirname(sys.argv[0])

Каталог скрипта, в котором выполняется python, добавлен в sys.pathНа самом деле это массив (список), который содержит другие пути. Первый элемент содержит полный путь, в котором расположен скрипт (для окон).

Поэтому для окон можно использовать:

import sys
path = sys.path[0]
print(path)

Другие предложили использовать sys.argv[0] который работает очень похожим образом и является полным.

import sys
path = os.path.dirname(sys.argv[0])
print(path)

Обратите внимание, что sys.argv[0] содержит полный рабочий каталог (путь) + имя файла, тогда как sys.path[0] текущий рабочий каталог без имени файла.

Я проверил sys.path[0] на окнах, и это работает. Я не тестировал другие операционные системы за пределами Windows, поэтому кто-то может пожелать прокомментировать это.

Помимо вышеупомянутого sys.argv[0]также можно использовать __main__:

import __main__
print(__main__.__file__)

Остерегайтесь, однако, это полезно только в очень редких обстоятельствах; и это всегда создает цикл импорта, что означает, что __main__ не будет полностью выполнен в этот момент.

Другие вопросы по тегам