Python имя запущенного скрипта

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

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

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

19 ответов

Использование __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__ это исполняемый файл, как указано в официальной документации:

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

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

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

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

import __main__ as main print(main.__file__) 

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

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

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

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

Начиная с Python 3.5, вы можете просто:

from pathlib import Path Path(__file__).stem 

Например, в моем пользовательском каталоге есть файл с именем test.py с этим внутри:

from pathlib import Path print(Path(__file__).stem) print(__file__) 
>>> python3.6 test.py test test.py 

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

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

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

Первый аргумент в 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] 

Мы можем попробовать это, чтобы получить текущее имя скрипта без расширения.

import os script_name = os.path.splitext(os.path.basename(__file__))[0] 

Вы можете сделать это без импорта операционной системы или других библиотек.

Если вы хотите получить путь к текущему скрипту Python, используйте: __file__

Если вы хотите получить только имя файла без расширения.py, используйте это:

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

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

Все эти ответы хороши, но есть некоторые проблемы, которые вы можете не заметить с первого взгляда.

позволяет определить, что мы хотим — нам нужно имя выполняемого скрипта, а не имя текущего модуля — поэтому __file__ будет работать, только если он используется в исполняемом скрипте, а не в импортированном модуле. sys.argv также сомнительно — что, если бы ваша программа была вызвана pytest? или pydoc runner? или если он был вызван uwsgi?

и — есть третий метод получения имени скрипта, который я не видел в ответах — вы можете проверить стек.

Другая проблема заключается в том, что Вы (или какая-либо другая программа) можете вмешиваться в sys.argv а также __main__.__file__ — может быть, а может и нет. Это может быть действительным или нет. По крайней мере, Вы можете проверить, существует ли скрипт (желаемый результат)!

библиотека lib_programname делает именно это:

  • проверить, если __main__ настоящее
  • проверить, если __main__.__file__ настоящее
  • дает __main__.__file__ действительный результат (существует ли этот сценарий?)
  • если нет: проверьте sys.argv:
  • есть ли в sys.argv pytest, docrunner и т. д.? -> если да, игнорируйте это
  • можем ли мы получить здесь достоверный результат?
  • если нет: проверьте стек и, возможно, получите результат оттуда
  • если также стек не дает допустимого результата, то генерирует исключение.

таким образом, мое решение пока работает с setup.py test , uwsgi , pytest , pycharm pytest , pycharm docrunner (doctest) , dreampie , eclipse

есть также хорошая статья в блоге об этой проблеме от Dough Hellman, «Определение имени процесса из Python»

Кстати, он снова изменится в python 3.9: атрибут файлаосновного модуля стал абсолютным путем, а не относительным путем. Эти пути теперь остаются действительными после изменения текущего каталога с помощью os.chdir()

Поэтому я предпочитаю позаботиться об одном небольшом модуле, вместо того, чтобы просматривать мою кодовую базу, если ее нужно что-то изменить.

Отказ от ответственности: я являюсь автором библиотеки lib_programname.

Источник

Get name of current script in Python

You can use __file__ to get the name of the current file. When used in the main module, this is the name of the script that was originally invoked.

If you want to omit the directory part (which might be present), you can use os.path.basename(__file__) .

For completeness’ sake, I thought it would be worthwhile summarizing the various possible outcomes and supplying references for the exact behaviour of each.

The answer is composed of four sections:

  1. A list of different approaches that return the full path to the currently executing script.
  2. A caveat regarding handling of relative paths.
  3. A recommendation regarding handling of symbolic links.
  4. An account of a few methods that could be used to extract the actual file name, with or without its suffix, from the full file path.

Extracting the full file path

__file__ is the pathname of the file from which the module was loaded, if it was loaded from a file. The __file__ attribute may be missing for certain types of modules, such as C modules that are statically linked into the interpreter; for extension modules loaded dynamically from a shared library, it is the pathname of the shared library file.

argv[0] is the script name (it is operating system dependent whether this is a full pathname or not). If the command was executed using the -c command line option to the interpreter, argv[0] is set to the string ‘-c’ . If no script name was passed to the Python interpreter, argv[0] is the empty string.

import inspect source_file_path = inspect.getfile(inspect.currentframe()) 
import lib_programname # this returns the fully resolved path to the launched python program path_to_program = lib_programname.get_path_executed_script() # type: pathlib.Path 

Handling relative paths

When dealing with an approach that happens to return a relative path, it might be tempting to invoke various path manipulation functions, such as os.path.abspath(. ) or os.path.realpath(. ) in order to extract the full or real path.

However, these methods rely on the current path in order to derive the full path. Thus, if a program first changes the current working directory, for example via os.chdir(. ) , and only then invokes these methods, they would return an incorrect path.

If the current script is a symbolic link, then all of the above would return the path of the symbolic link rather than the path of the real file and os.path.realpath(. ) should be invoked in order to extract the latter.

Further manipulations that extract the actual file name

os.path.basename(. ) may be invoked on any of the above in order to extract the actual file name and os.path.splitext(. ) may be invoked on the actual file name in order to truncate its suffix, as in os.path.splitext(os.path.basename(. )) .

From Python 3.4 onwards, per PEP 428, the PurePath class of the pathlib module may be used as well on any of the above. Specifically, pathlib.PurePath(. ).name extracts the actual file name and pathlib.PurePath(. ).stem extracts the actual file name without its suffix.

This will print foo.py for python foo.py , dir/foo.py for python dir/foo.py , etc. It’s the first argument to python . (Note that after py2exe it would be foo.exe .)

Источник

Получение пути и имени текущего исполняемого файла Python

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

Допустим, есть три файла: main_script.py , helper_1.py и helper_2.py . В main_script.py вызывается helper_1.py , который в свою очередь запускает helper_2.py . Задача — узнать путь и имя файла helper_2.py , прямо из кода этого файла, без передачи этой информации в качестве аргументов из helper_1.py .

Существует простой способ получить эту информацию, используя встроенный модуль Python, под названием os .

import os current_file = os.path.realpath(__file__) current_directory = os.path.dirname(current_file)

В этом коде, __file__ — это специальная переменная, которая содержит путь к скрипту, который был запущен. Функция os.path.realpath(path) возвращает канонический путь к указанному файлу, устраняя все символические ссылки (если они присутствуют). Таким образом, os.path.realpath(__file__) вернет абсолютный путь до файла.

Функция os.path.dirname(path) возвращает имя директории пути path . Её можно использовать, чтобы получить путь к директории, в которой находится файл.

Также следует отметить, что если попытаться использовать функцию os.getcwd() , она вернет путь к директории, откуда был запущен первоначальный скрипт, а не текущего исполняемого файла.

Надеемся, что эта информация поможет в работе с Python и позволит лучше понимать, как работает этот замечательный язык программирования.

Источник

Читайте также:  Обработка собственных исключений python
Оцените статью