Как получить текущий файл, текущий класс и текущий метод с Python?

Это решение убивает дерево процессов в случае оболочки = True, передает параметры процессу (или нет), имеет тайм-аут и получает вывод stdout, stderr и процесс обратного вызова (он использует psutil для kill_proc_tree) , Это было основано на нескольких решениях, размещенных в SO, включая jcollado's. Проводка в ответ на комментарии Ансона и юрида в ответ jcollado. Протестировано в Windows Srvr 2012 и Ubuntu 14.04. Обратите внимание, что для Ubuntu вам необходимо изменить вызов parent.children (...) parent.get_children (...).

def kill_proc_tree(pid, including_parent=True):
  parent = psutil.Process(pid)
  children = parent.children(recursive=True)
  for child in children:
    child.kill()
  psutil.wait_procs(children, timeout=5)
  if including_parent:
    parent.kill()
    parent.wait(5)

def run_with_timeout(cmd, current_dir, cmd_parms, timeout):
  def target():
    process = subprocess.Popen(cmd, cwd=current_dir, shell=True, stdout=subprocess.PIPE, stdin=subprocess.PIPE, stderr=subprocess.PIPE)

    # wait for the process to terminate
    if (cmd_parms == ""):
      out, err = process.communicate()
    else:
      out, err = process.communicate(cmd_parms)
    errcode = process.returncode

  thread = Thread(target=target)
  thread.start()

  thread.join(timeout)
  if thread.is_alive():
    me = os.getpid()
    kill_proc_tree(me, including_parent=False)
    thread.join()
30
задан Facundo Casco 5 May 2012 в 20:34
поделиться

4 ответа

Вот пример каждого:

from inspect import stack

class Foo:
    def __init__(self):
        print __file__
        print self.__class__.__name__
        print stack()[0][3]

f = Foo()
30
ответ дан 28 November 2019 в 00:01
поделиться
import sys

class A:
    def __init__(self):
        print __file__
        print self.__class__.__name__
        print sys._getframe().f_code.co_name

a = A()
10
ответ дан 28 November 2019 в 00:01
поделиться
self.__class__.__name__  # name of class i'm in

для остальных модулей sys и trace

http://docs.python.org/library/sys.html http://docs.python.org/library /trace.html

Дополнительная информация: https://mail.python.org/pipermail/python-list/2001-August/096499.html и http://www.dalkescientific.com/writings/diary/archive/2005/04/20/tracing_python_code.html

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

http : //docs.python.org/library/traceback.html

5
ответ дан 28 November 2019 в 00:01
поделиться

Будьте очень осторожны. Подумайте:

class A:
    pass

B = A
b = B()

Какое здесь «имя класса» b ? Это А или Б? Почему?

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

3
ответ дан 28 November 2019 в 00:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: