Как получить путь и имя файла, который в настоящее время выполняется?

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

Например, допустим, у меня есть три файла. Использование execfile :

  • script_1.py вызывает script_2.py .
  • В свою очередь script_2.py вызывает script_3.py .

Как получить имя и путь к script_3.py из кода в script_3.py , не передавая эту информацию в качестве аргументов из script_2.py ?

(Выполнение os.getcwd() возвращает os.getcwd() к исходному файлу исходного скрипта, а не текущий файл.)

  • Классы словаря Python (которые являются объектами класса) сравниваются с несколькими компараторами
  • pandas создает новый столбец на основе значений из других столбцов
  • Ошибки аргументов python ctypes
  • Pythonic способ распечатать элементы списка
  • Доступны ли ключи сортировки python только один раз?
  • Чтение и запись файла .docx с помощью python
  • Python interp1d против UnivariateSpline
  • как получить среднее значение столбцов dataframe
  • 21 Solutions collect form web for “Как получить путь и имя файла, который в настоящее время выполняется?”

    p1.py:

     execfile("p2.py") 

    p2.py:

     import inspect, os print inspect.getfile(inspect.currentframe()) # script filename (usually with path) print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # script directory 
     __file__ 

    как говорили другие. Вы также можете использовать:

     import os os.path.realpath(__file__) 

    Я думаю, что это чище:

     import inspect print inspect.stack()[0][1] 

    и получает ту же информацию, что и:

     print inspect.getfile(inspect.currentframe()) 

    Где [0] – текущий кадр в стеке (верхняя часть стека), а [1] – имя файла, увеличение для возврата в стеке, т.е.

     print inspect.stack()[1][1] 

    будет именем файла сценария, который называется текущим фреймом. Кроме того, использование [-1] приведет вас к нижней части стека, оригинальному сценарию вызова.

    Вот эксперимент, основанный на ответах в этом потоке – с Python 2.7.10 на Windows.

    Только на основе стека есть надежные результаты. Последние два имеют самый короткий синтаксис , т. Е.

     print os.path.abspath(inspect.stack()[0][1]) # C:\testpath\lib\script3.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\testpath\lib 

    Вот к ним добавляются функции sys как функции! Кредит @Usagi и @pablog

    На основе следующих трех файлов и запуска скрипта script1.py из его папки с python script1.py (также попробовал execfiles с абсолютными путями и вызовом из отдельной папки).

    C: \ testpath \ script1.py: execfile('script2.py')
    C: \ testpath \ script2.py: execfile('lib/script3.py')
    C: \ testpath \ Lib \ script3.py:

     import sys import os import inspect print "Python " + sys.version print print __file__ # script1.py print sys.argv[0] # script1.py print inspect.stack()[0][1] # lib/script3.py print sys.path[0] # C:\testpath print print os.path.realpath(__file__) # C:\testpath\script1.py print os.path.abspath(__file__) # C:\testpath\script1.py print os.path.basename(__file__) # script1.py print os.path.basename(os.path.realpath(sys.argv[0])) # script1.py print print sys.path[0] # C:\testpath print os.path.abspath(os.path.split(sys.argv[0])[0]) # C:\testpath print os.path.dirname(os.path.abspath(__file__)) # C:\testpath print os.path.dirname(os.path.realpath(sys.argv[0])) # C:\testpath print os.path.dirname(__file__) # (empty string) print print inspect.getfile(inspect.currentframe()) # lib/script3.py print os.path.abspath(inspect.getfile(inspect.currentframe())) # C:\testpath\lib\script3.py print os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) # C:\testpath\lib print print os.path.abspath(inspect.stack()[0][1]) # C:\testpath\lib\script3.py print os.path.dirname(os.path.abspath(inspect.stack()[0][1])) # C:\testpath\lib print 

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

    Если вы хотите узнать имя исполняемого файла (то есть корневой файл, переданный интерпретатору python для текущей программы) из файла, который может быть импортирован в виде модуля, вам нужно это сделать (предположим, что это файл named foo.py ):

    import inspect

    print inspect.stack()[-1][1]

    Потому что последняя вещь ( [-1] ) в стеке – первая вещь, которая вошла в нее (стеки представляют собой структуры данных LIFO / FILO).

    Затем в файле bar.py, если вы import foo он будет печатать bar.py , а не foo.py , что будет значением всех из них:

    • __file__
    • inspect.getfile(inspect.currentframe())
    • inspect.stack()[0][1]
     import os os.path.dirname(__file__) # relative directory path os.path.abspath(__file__) # absolute file path os.path.basename(__file__) # the file name only 
     import os print os.path.basename(__file__) 

    это даст нам только имя файла. т.е. если abspath файла – c: \ abcd \ abc.py, тогда вторая строка будет печатать abc.py

    Не совсем понятно, что вы подразумеваете под «файловым файлом файла, который в настоящее время запущен в процессе». sys.argv[0] обычно содержит расположение скрипта, который был вызван интерпретатором Python. Подробнее см. Документацию по системе sys .

    Как указывали @Tim и @Pat Notz, атрибут __file__ предоставляет доступ к

    файл, из которого был загружен модуль, если он был загружен из файла

    У меня есть сценарий, который должен работать в среде Windows. Этот код перекошен – это то, с чем я закончил:

     import os,sys PROJECT_PATH = os.path.abspath(os.path.split(sys.argv[0])[0]) 

    это довольно хакерское решение. Но он не требует внешних библиотек, и это самое главное в моем случае.

    __file__ работает как для файла, содержащего основной код выполнения, так и для импортированных модулей.

    См. https://web.archive.org/web/20090918095828/http://pyref.infogami.com/__file__

     import sys print sys.path[0] 

    это будет печатать путь исполняемого в настоящее время скрипта

    Я думаю, что это просто __file__ Похоже, вы также можете проверить контрольный модуль .

     import os os.path.dirname(os.path.abspath(__file__)) 

    Нет необходимости в проверке или в любой другой библиотеке.

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

     import sys print sys.argv[0] 

    Вы можете использовать inspect.stack()

     import inspect,os inspect.stack()[0] => (<frame object at 0x00AC2AC0>, 'g:\\Python\\Test\\_GetCurrentProgram.py', 15, '<module>', ['print inspect.stack()[0]\n'], 0) os.path.abspath (inspect.stack()[0][1]) => 'g:\\Python\\Test\\_GetCurrentProgram.py' 

    Это должно работать:

     import os,sys filename=os.path.basename(os.path.realpath(sys.argv[0])) dirname=os.path.dirname(os.path.realpath(sys.argv[0])) 

    Я использовал подход с __file__
    os.path.abspath(__file__)
    но есть небольшой трюк, он возвращает файл .py, когда код запускается в первый раз, в следующих прогонах указывается имя файла * .pyc
    поэтому я остался с:
    inspect.getfile(inspect.currentframe())
    или
    sys._getframe().f_code.co_filename

    если вы хотите просто имя файла без ./ или .py вы можете попробовать это

     filename = testscript.py file_name = __file__[2:-3] 

    file_name будет печатать testcript, вы можете генерировать все, что хотите, изменяя индекс внутри []

    Я написал функцию, которая учитывает отладчик eclipse и unittest . Он возвращает папку первого запускаемого вами скрипта. Вы можете указать опцию __file__ var, но главное, что вам не нужно передавать эту переменную во всю вашу иерархию вызовов .

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

     import inspect, os def getRootDirectory(_file_=None): """ Get the directory of the root execution file Can help: http://stackoverflow.com/questions/50499/how-do-i-get-the-path-and-name-of-the-file-that-is-currently-executing For eclipse user with unittest or debugger, the function search for the correct folder in the stack You can pass __file__ (with 4 underscores) if you want the caller directory """ # If we don't have the __file__ : if _file_ is None: # We get the last : rootFile = inspect.stack()[-1][1] folder = os.path.abspath(rootFile) # If we use unittest : if ("/pysrc" in folder) & ("org.python.pydev" in folder): previous = None # We search from left to right the case.py : for el in inspect.stack(): currentFile = os.path.abspath(el[1]) if ("unittest/case.py" in currentFile) | ("org.python.pydev" in currentFile): break previous = currentFile folder = previous # We return the folder : return os.path.dirname(folder) else: # We return the folder according to specified __file__ : return os.path.dirname(os.path.realpath(_file_)) 

    Чтобы получить каталог исполняемого скрипта

      print os.path.dirname( inspect.getfile(inspect.currentframe())) 
     import os import wx # return the full path of this file print(os.getcwd()) icon = wx.Icon(os.getcwd() + '/img/image.png', wx.BITMAP_TYPE_PNG, 16, 16) # put the icon on the frame self.SetIcon(icon) 
    Python - лучший язык программирования в мире.