Как я могу получить путь и имя файла, который выполняется в настоящее время? - PullRequest
441 голосов
/ 08 сентября 2008

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

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

  • script_1.py звонки script_2.py.
  • В свою очередь, script_2.py звонит script_3.py.

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

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

Ответы [ 27 ]

0 голосов
/ 24 января 2013
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)
0 голосов
/ 01 марта 2011

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

0 голосов
/ 23 января 2019

Я всегда использовал функцию os текущего рабочего каталога или CWD. Это часть стандартной библиотеки, и ее очень легко реализовать. Вот пример:

    import os
    base_directory = os.getcwd()
0 голосов
/ 09 ноября 2018

Большинство из этих ответов были написаны на Python версии 2.x или более ранней. В Python 3.x синтаксис для функции печати изменился и теперь требует скобок, то есть print ().

Итак, этот более ранний ответ от пользователя 13993 в Python 2.x:

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

Становится в Python 3.x:

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
0 голосов
/ 08 июня 2018

Самый простой способ:

in script_1.py:

import subprocess
subprocess.call(['python3',<path_to_script_2.py>])

in script_2.py:

sys.argv[0]

P.S .: Я пробовал execfile, но так как он читает script_2.py в виде строки, sys.argv[0] вернул <string>.

0 голосов
/ 14 июня 2016

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

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

import inspect, os
def getRootDirectory(_file_=None):
    """
    Get the directory of the root execution file
    Can help: /37816/kak-ya-mogu-poluchit-put-i-imya-faila-kotoryi-vypolnyaetsya-v-nastoyaschee-vremya
    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_))
0 голосов
/ 21 января 2013

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...