500 Ошибка сервера для Python в сценарии ASP - PullRequest
8 голосов
/ 13 февраля 2012

Следующий скрипт asp выдаёт мне ошибку: «HTTP / 1.1 500 Server Error»

<%@ Language = Python%>
<%
def main():
    Response.Write("My first ASP script!")
main()
%>

при запуске на IIS 7.5 Windows 7 (64-разрядная версия). В журнале ошибок просто упоминается ошибка ASP_0147.

Я установил Python 3.2 и Active Python 3.2.2.3 на сервер и зарегистрировал Python через: pyscript.py

Я включил 32-битные приложения для сервера. Я также установил Python для Windows, чтобы посмотреть, поможет ли это.

Можете ли вы предложить, как я мог бы это исправить?

UPDATE:

Мне удалось заставить это работать сейчас для python3, но я должен зарегистрироваться в --debug следующим образом:

C:\Python32\Lib\site-packages\win32comext\axscript\client>c:\Python32\python.exe
 pyscript.py --debug
Requesting elevation and retrying...
Registered: Python (for debugging)

Почему он будет работать только в режиме отладки? Безопасно ли работать в этом режиме?

Вот трассировка при включенной отладке:

Object with win32trace dispatcher created (object=None)
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-SetScriptSite(<PyIActiveScriptSite at 0x00000000036923B0 with obj at 0x000000000056FFD8>,) [1,0,None]
Debugging extensions (axdebug) module does not exist - debugging is disabled.. 
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._QueryInterface_ with unsupported IID IActiveScriptProperty ({4954E0D0-FBC7-11D1-8410-006008C3FBFC})
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-InitNew() [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-GetScriptDispatch(None,) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._QueryInterface_ with unsupported IID {1D044690-8923-11D0-ABD2-00A0C911E8B2} ({1D044690-8923-11D0-ABD2-00A0C911E8B2})
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('Response', 66) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('Request', 66) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('Server', 66) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('Session', 66) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('Application', 66) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('ObjectContext', 66) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('ASPGLOBALTLB', 74) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-ParseScriptText('def main():\r\n    Response.Write("My first ASP script!")\r\nmain()\r\n', None, None, 'STRIP EMBEDDED HTML COMMENTS', 0, 1, 192, 0) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-GetScriptDispatch(None,) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-AddNamedItem('ScriptingNamespace', 10) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-SetScriptState(1,) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-SetScriptState(0,) [1,0,None]
in <win32com.axscript.client.pyscript.PyScript object at 0x00000000035946A0>._InvokeEx_-Close() [1,0,None]

Спасибо

Barry

Ответы [ 2 ]

5 голосов
/ 13 февраля 2012

Не может быть подходящим решением, в прошлом у меня была эта проблема.Последние версии activepython, кажется, сломаны для активных сценариев.Я был в состоянии только версия 2.5.6.10.Если версия не важна, вы можете попробовать эту более старую версию.

2 голосов
/ 31 мая 2013

Проблема заключается в методе trace и операторах print в win32comext\axscript\client\framework.py, поскольку в COM-компонентах запись в sys.stdout или sys.stderr, как в операторе print, вызывает исключение, например trace("Debugging extensions (axdebug) module does not exist - debugging is disabled..") встрока 572 из framework.py вызывает исключение.

Одним из обходных путей является добавление import win32traceutil в framework.py.win32traceutil перенаправляет вывод в win32trace remote collector и решает проблему без необходимости включать отладку, которая вызывает проблемы с производительностью.

Другой обходной путь - перенаправление stdout и stderr на ноль, можно добавить следующий фрагмент коданаверху framework.py.

  f = open('nul', 'w')
  sys.stdout = f
  sys.stderr = f

ОБНОВЛЕНИЕ: основная причина и решение

В framework.py уже есть механизм для предотвращения печати иОператоры трассировки вызывают исключение, но проблема в методе write класса SafeOutput.Когда трассировка и отладка не включены, в методе записи возникает исключение, и win32api.OutputDebugString в предложении "исключение" вызывает неправильную кодировку, которая вызывает исключение.Поскольку win32api.OutputDebugString принимает строку Unicode, а не многобайтовый набор символов (MBCS) в качестве аргумента.

Решение:

в win32comext\axscript\client\framework.py в SafeOutput классе

class SafeOutput:
softspace=1
def __init__(self, redir=None):
    if redir is None: redir = sys.stdout
    self.redir=redir
def write(self,message):
    try:
        self.redir.write(message)
    except:
        win32api.OutputDebugString(message.encode('mbcs'))
def flush(self):
    pass
def close(self):
    pass

просто изменить

win32api.OutputDebugString(message.encode('mbcs'))  # ANSI Enconding

на

win32api.OutputDebugString(message) # Unicode
...