Получить имя текущего скрипта в Python

Я пытаюсь получить имя скрипта Python, который в данный момент выполняется.

У меня есть скрипт с именем foo.py, и я хотел бы сделать что-то подобное, чтобы получить имя скрипта:

print Scriptname

Ответ 1

Используйте __file__. Если вы хотите опустить часть каталога (которая может присутствовать), вы можете использовать os.path.basename(__file__).

Ответ 2

import sys
print sys.argv[0]

Это напечатает foo.py для python foo.py, dir/foo.py для python dir/foo.py и т.д. Это первый аргумент python. (Обратите внимание, что после py2exe это будет foo.exe.)

Ответ 3

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

import __main__ as main
print(main.__file__)

Обратите внимание, что __main__.__file__ работает в Python 2.7, но не в 3.2, поэтому используйте синтаксис import-as, как указано выше, чтобы сделать его переносимым.

Ответ 4

Для полноты я подумал, что было бы целесообразно обобщить различные возможные результаты и предоставить ссылки для точного поведения каждого из них:

  • __file__ - текущий исполняемый файл, как описано в официальной документации :

    __file__ - это путь к файлу, из которого был загружен модуль, если он был загружен из файла. Атрибут __file__ может отсутствовать для определенных типов модулей, таких как C-модули, которые статически связаны с интерпретатором; для модулей расширения, загружаемых динамически из общей библиотеки, это путь к файлу разделяемой библиотеки.

    Начиная с Python3.4, за issue 18416, __file__ всегда является абсолютным путем, если только исполняемый файл script, который был выполнен напрямую (не через интерпретатор с параметром командной строки -m), используя относительный путь.

  • __main__.__file__ (требует импорта __main__) просто обращается к вышеупомянутому атрибуту __file__ основного модуля , например. из script, который был вызван из командной строки.

  • sys.argv[0] (требуется импорт sys) - это имя script, которое было вызвано из командной строки, и может быть абсолютным путем, как описано в официальная документация:

    argv[0] - это имя script (зависит от операционной системы, является ли это полным именем пути или нет). Если команда была выполнена с использованием опции командной строки -c для интерпретатора, argv[0] устанавливается в строку '-c'. Если для интерпретатора Python не было отправлено имя script, argv[0] - это пустая строка.

    Как упоминалось в другом ответе на этот вопрос, скрипты Python, которые были преобразованы в автономные исполняемые программы с помощью таких инструментов, как py2exe или PyInstaller может не отображать желаемый результат при использовании этого подхода (т.е. sys.argv[0] будет содержать имя исполняемого файла, а не имя основного файла Python в этом исполняемом файле).


os.path.basename() может быть вызван для любого из вышеперечисленного, чтобы извлечь фактическое имя файла.

Ответ 5

Выше ответы хорошие. Но я нашел этот метод более эффективным, используя приведенные выше результаты.
Это приводит к фактическому имени файла script не пути.

import sys    
import os    
file_name =  os.path.basename(sys.argv[0])

Ответ 6

Попробуйте следующее:

print __file__

Ответ 7

Для современных версий Python Path(__file__).name должен быть более идиоматическим. Кроме того, Path(__file__).stem дает вам имя сценария без расширения .py.

Ответ 8

Первым аргументом в sys будет имя текущего файла, так что это будет работать

   import sys
   print sys.argv[0] # will print the file name

Ответ 9

Примечание. Если вы используете Python 3+, вам следует использовать вместо него функцию print()

Предполагая, что имя файла foo.py, приведенный ниже фрагмент

import sys
print sys.argv[0][:-3]

или

import sys
print sys.argv[0][::-1][3:][::-1]

Что касается других расширений с большим количеством символов, например, имя файла foo.pypy

import sys
print sys.argv[0].split('.')[0]

Если вы хотите извлечь из абсолютного пути

import sys
print sys.argv[0].split('/')[-1].split('.')[0]

выведет foo

Ответ 10

Если вы делаете необычный импорт (например, это файл опций), попробуйте:

import inspect
print (inspect.getfile(inspect.currentframe()))

Обратите внимание, что это вернет абсолютный путь к файлу.

Ответ 11

Мое быстрое грязное решение:

__file__.split('/')[-1:][0]

Ответ 13

Поскольку ОП запросил имя текущего файла сценария, я бы предпочел

import os
os.path.split(sys.argv[0])[1]