Exemplo n.º 1
0
def _extract_stack(limit):
    try:
        frame = sys_getframe()
    except ValueError:
        # In certain embedded cases that directly use the Python C api
        # to call Greenlet.spawn (e.g., uwsgi) this can raise
        # `ValueError: call stack is not deep enough`. This is because
        # the Cython stack frames for Greenlet.spawn ->
        # Greenlet.__init__ -> _extract_stack are all on the C level,
        # not the Python level.
        # See https://github.com/gevent/gevent/issues/1212
        frame = None

    newest_Frame = None
    newer_Frame = None

    while limit and frame is not None:
        limit -= 1
        older_Frame = _Frame()
        # Arguments are always passed to the constructor as Python objects,
        # meaning we wind up boxing the f_lineno just to unbox it if we pass it.
        # It's faster to simply assign once the object is created.
        older_Frame.f_code = frame.f_code
        older_Frame.f_lineno = get_f_lineno(frame)  # pylint:disable=undefined-variable
        if newer_Frame is not None:
            newer_Frame.f_back = older_Frame
        newer_Frame = older_Frame
        if newest_Frame is None:
            newest_Frame = newer_Frame

        frame = get_f_back(frame)  # pylint:disable=undefined-variable

    return newest_Frame
Exemplo n.º 2
0
def _extract_stack(limit):
    try:
        frame = sys_getframe()
    except ValueError:
        # In certain embedded cases that directly use the Python C api
        # to call Greenlet.spawn (e.g., uwsgi) this can raise
        # `ValueError: call stack is not deep enough`. This is because
        # the Cython stack frames for Greenlet.spawn ->
        # Greenlet.__init__ -> _extract_stack are all on the C level,
        # not the Python level.
        # See https://github.com/gevent/gevent/issues/1212
        frame = None

    newest_Frame = None
    newer_Frame = None

    while limit and frame is not None:
        limit -= 1
        older_Frame = _Frame()
        # Arguments are always passed to the constructor as Python objects,
        # meaning we wind up boxing the f_lineno just to unbox it if we pass it.
        # It's faster to simply assign once the object is created.
        older_Frame.f_code = frame.f_code
        older_Frame.f_lineno = get_f_lineno(frame) # pylint:disable=undefined-variable
        if newer_Frame is not None:
            newer_Frame.f_back = older_Frame
        newer_Frame = older_Frame
        if newest_Frame is None:
            newest_Frame = newer_Frame

        frame = get_f_back(frame) # pylint:disable=undefined-variable

    return newest_Frame
Exemplo n.º 3
0
def _extract_stack(limit):
    frame = sys_getframe()
    frames = []

    while limit and frame is not None:
        limit -= 1
        frames.append((frame.f_code, frame.f_lineno))
        frame = frame.f_back

    return frames
Exemplo n.º 4
0
 def details(self, msg, depth=2):
     """
     encapsulate the message to write into log file
     """
     frame = sys_getframe(depth)
     cur_file = ospath.basename(frame.f_code.co_filename)
     linenum = ''
     if frame.f_back is not None:
         linenum = frame.f_back.f_lineno
     info = "%s - %s line:%s" % (cur_file, frame.f_code.co_name, linenum)
     return "%s | %s" % (info, msg)
Exemplo n.º 5
0
def _extract_stack(limit):
    try:
        frame = sys_getframe()
    except ValueError:
        # In certain embedded cases that directly use the Python C api
        # to call Greenlet.spawn (e.g., uwsgi) this can raise
        # `ValueError: call stack is not deep enough`. This is because
        # the Cython stack frames for Greenlet.spawn ->
        # Greenlet.__init__ -> _extract_stack are all on the C level,
        # not the Python level.
        # See https://github.com/gevent/gevent/issues/1212
        frame = None

    frames = []

    while limit and frame is not None:
        limit -= 1
        frames.append((frame.f_code, frame.f_lineno))
        frame = frame.f_back

    return frames
Exemplo n.º 6
0
def _extract_stack(limit):
    try:
        frame = sys_getframe()
    except ValueError:
        # In certain embedded cases that directly use the Python C api
        # to call Greenlet.spawn (e.g., uwsgi) this can raise
        # `ValueError: call stack is not deep enough`. This is because
        # the Cython stack frames for Greenlet.spawn ->
        # Greenlet.__init__ -> _extract_stack are all on the C level,
        # not the Python level.
        # See https://github.com/gevent/gevent/issues/1212
        frame = None

    frames = []

    while limit and frame is not None:
        limit -= 1
        frames.append((frame.f_code, frame.f_lineno))
        frame = frame.f_back

    return frames
Exemplo n.º 7
0
def get_current_func_info_by_sys(logger=None) -> None:
    """
    通过sys获取执行信息并打印
    :param logger:
    :return:
    """
    now_frame = sys_getframe()
    _print(
        msg='-> file_path: {}, func_name: {} in line_num: {} invoked'.format(
            # 获取被调用函数所在模块文件名
            now_frame.f_code.co_filename,
            # 获取被调用函数名称
            now_frame.f_code.co_name,
            # 获取被调用函数在被调用时所处代码行数
            now_frame.f_back.f_lineno,
        ),
        logger=logger,
        log_level=1,
    )

    return None