Я пытаюсь получить имя скрипта Python, который в данный момент выполняется.
У меня есть скрипт с именем foo.py
, и я хотел бы сделать что-то подобное, чтобы получить имя скрипта:
print Scriptname
Я пытаюсь получить имя скрипта Python, который в данный момент выполняется.
У меня есть скрипт с именем foo.py
, и я хотел бы сделать что-то подобное, чтобы получить имя скрипта:
print Scriptname
Используйте __file__
. Если вы хотите опустить часть каталога (которая может присутствовать), вы можете использовать os.path.basename(__file__)
.
import sys
print sys.argv[0]
Это напечатает foo.py
для python foo.py
, dir/foo.py
для python dir/foo.py
и т.д. Это первый аргумент python
. (Обратите внимание, что после py2exe это будет foo.exe
.)
Обратите внимание, что __file__
предоставит файл, в котором находится этот код, который может быть импортирован и отличается от основного интерпретируемого файла. Чтобы получить основной файл, можно использовать специальный __main__ модуль:
import __main__ as main
print(main.__file__)
Обратите внимание, что __main__.__file__
работает в Python 2.7, но не в 3.2, поэтому используйте синтаксис import-as, как указано выше, чтобы сделать его переносимым.
Для полноты я подумал, что было бы целесообразно обобщить различные возможные результаты и предоставить ссылки для точного поведения каждого из них:
__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()
может быть вызван для любого из вышеперечисленного, чтобы извлечь фактическое имя файла.
Выше ответы хорошие. Но я нашел этот метод более эффективным, используя приведенные выше результаты.
Это приводит к фактическому имени файла script не пути.
import sys
import os
file_name = os.path.basename(sys.argv[0])
Попробуйте следующее:
print __file__
Для современных версий Python Path(__file__).name
должен быть более идиоматическим. Кроме того, Path(__file__).stem
дает вам имя сценария без расширения .py
.
Первым аргументом в sys будет имя текущего файла, так что это будет работать
import sys
print sys.argv[0] # will print the file name
Предполагая, что имя файла 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
Если вы делаете необычный импорт (например, это файл опций), попробуйте:
import inspect
print (inspect.getfile(inspect.currentframe()))
Обратите внимание, что это вернет абсолютный путь к файлу.
Мое быстрое грязное решение:
__file__.split('/')[-1:][0]
os.path.abspath(__file__)
даст вам абсолютный путь (relpath()
доступен relpath()
).
sys.argv[-1]
даст вам относительный путь.
Поскольку ОП запросил имя текущего файла сценария, я бы предпочел
import os
os.path.split(sys.argv[0])[1]