скажите, находится ли питон в режиме -i - PullRequest
5 голосов
/ 12 марта 2009

Как узнать, запущен ли python с флагом -i?

Согласно документам , вы можете проверить переменную PYTHONINSPECT в os.environ, которая является эквивалентом из -i. Но, видимо, это не работает так.

Работает:

$ PYTHONINSPECT=1 python -c 'import os; print os.environ["PYTHONINSPECT"]'

Не работает:

$ python -i -c 'import os; print os.environ["PYTHONINSPECT"]'

Причина, по которой я спрашиваю, заключается в том, что у меня есть скрипт, который вызывает sys.exit (-1), если определенные условия не выполняются. Это хорошо, но иногда я хочу отладить его вручную, используя -i. Я полагаю, что я могу просто научиться использовать «PYTHONINSPECT = 1 python» вместо «python -i», но было бы неплохо, если бы был универсальный способ сделать это.

Ответы [ 3 ]

3 голосов
/ 12 марта 2009

Как программно установить режим проверки

Ответ от по ссылке @ Jweede при условии является неточным. Должно быть:

import os
os.environ['PYTHONINSPECT'] = '1'

Как узнать, установлены ли интерактивные / проверочные флаги

Просто еще один вариант @ ответа Брайана :

import os
from ctypes import POINTER, c_int, cast, pythonapi

def in_interactive_inspect_mode():
    """Whether '-i' option is present or PYTHONINSPECT is not empty."""
    if os.environ.get('PYTHONINSPECT'): return True
    iflag_ptr = cast(pythonapi.Py_InteractiveFlag, POINTER(c_int))
    #NOTE: in Python 2.6+ ctypes.pythonapi.Py_InspectFlag > 0
    #      when PYTHONINSPECT set or '-i' is present 
    return iflag_ptr.contents.value != 0

См. Python main.c .

2 голосов
/ 13 марта 2009

Я посмотрел на источник, и хотя переменная, установленная при условии -i, хранится в Py_InteractiveFlag, похоже, что она не подвергается воздействию Python.

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

import ctypes, os

def interactive_inspect_mode():
    flagPtr = ctypes.cast(ctypes.pythonapi.Py_InteractiveFlag, 
                         ctypes.POINTER(ctypes.c_int))
    return flagPtr.contents.value > 0 or bool(os.environ.get("PYTHONINSPECT",False))

[Изменить] исправить опечатку, а также проверить PYTHONINSPECT (который не устанавливает переменную), как указано в комментариях.

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