Как я могу найти полный путь к текущему запущенному сценарию Python? То есть, что мне нужно сделать для достижения этого:
[email protected]:/tmp$ python baz.py
running from /tmp
file is baz.py
Как я могу найти полный путь к текущему запущенному сценарию Python? То есть, что мне нужно сделать для достижения этого:
[email protected]:/tmp$ python baz.py
running from /tmp
file is baz.py
__file__
НЕ является тем, что вы ищете. Не используйте случайные побочные эффекты
sys.argv[0]
всегда путь к script (если на самом деле был вызван script) - см. http://docs.python.org/library/sys.html#sys.argv
__file__
- это путь к исполняемому файлу (script или module). Это случайно так же, как script, если он доступен из script! Если вы хотите поместить полезные вещи, такие как поиск файлов ресурсов относительно местоположения script в библиотеке, вы должны использовать 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'
Это будет печатать каталог, в котором живет script (в отличие от рабочего каталога):
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() (docs)
Запустимый файл всегда __file__
.
Здесь демо script, названный identify.py
print __file__
Здесь результаты
MacBook-5:Projects slott$ python StackOverflow/identify.py
StackOverflow/identify.py
MacBook-5:Projects slott$ cd StackOverflow/
MacBook-5:StackOverflow slott$ python identify.py
identify.py
Я бы предложил
import os, sys
print os.path.split(os.path.abspath(os.path.realpath(sys.argv[0])))[0]
Таким образом вы можете безопасно создавать символические ссылки на исполняемый файл script, и он все равно найдет правильный каталог.
Имя скрипта будет (всегда?) Первым индексом sys.argv:
import sys
print sys.argv[0]
Еще более простой способ найти путь к вашему скрипту:
os.path.dirname(sys.argv[0])
Помимо вышеупомянутого sys.argv[0]
, также можно использовать __main__
:
import __main__
print(__main__.__file__)
Остерегайтесь, однако, это полезно только в очень редких случаях; и он всегда создает цикл импорта, что означает, что __main__
не будет полностью выполнен в этот момент.
Каталог скрипта, который выполняется 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]
на окнах, и он работает. Я не тестировал другие операционные системы за пределами окон, поэтому кто-то может пожелать прокомментировать это.