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 сказать мне...
Ответы
Ответ 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
и его различных возможностях читайте здесь.