Подтвердить что ты не робот

Python: как обнаружить отладочный интерпретатор

Как я могу обнаружить в моем python script, если он выполняется интерпретатором отладки (то есть python_d.exe, а не python.exe)? Мне нужно изменить пути к некоторым dll, которые я передаю в расширение.

eg Id нравится делать что-то подобное в начале моего python script:

#get paths to graphics dlls
if debug_build:
    d3d9Path   = "bin\\debug\\direct3d9.dll"
    d3d10Path  = "bin\\debug\\direct3d10.dll"
    openGLPath = "bin\\debug\\openGL2.dll"
else:
    d3d9Path   = "bin\\direct3d9.dll"
    d3d10Path  = "bin\\direct3d10.dll"
    openGLPath = "bin\\openGL2.dll"

Я подумал о добавлении метода "IsDebug()" к расширению, которое вернет true, если это сборка отладки (т.е. была построена с "#define DEBUG" ) и false в противном случае. Но это кажется немного взломанным для somthing. Я уверен, что могу заставить python сказать мне...

4b9b3361

Ответ 1

Distutils использует sys.gettotalrefcount для обнаружения отладочной сборки python:

# ...
if hasattr(sys, 'gettotalrefcount'):
   plat_specifier += '-pydebug'
  • Этот метод не полагается на исполняемое имя '*_d.exe'. Он работает для любого имени.
  • Этот метод является кросс-платформенным. Это не зависит от суффикса '_d.pyd.

См. Отладка сборки и Misc/SpecialBuilds.txt

Ответ 2

Лучше, потому что он также работает, когда вы запускаете встроенный интерпретатор Python, чтобы проверить возвращаемое значение

imp.get_suffixes()

Для сборки отладки он содержит кортеж, начинающийся с '_d.pyd':

# debug build:
[('_d.pyd', 'rb', 3), ('.py', 'U', 1), ('.pyw', 'U', 1), ('.pyc', 'rb', 2)]

# release build:
[('.pyd', 'rb', 3), ('.py', 'U', 1), ('.pyw', 'U', 1), ('.pyc', 'rb', 2)]

Ответ 3

Простым способом, если вы не против полагаться на имя файла:

if sys.executable.endswith("_d.exe"):
  print "running on debug interpreter"

Подробнее о модуле sys и его различных возможностях читайте здесь.