如何在WSC中调试Python
我们正在为一个大型的老旧网页应用程序编写经典ASP代码。现在使用WSC(Windows脚本组件)来把用户界面和业务逻辑分开,这样做效果不错;WSC里面包含了业务逻辑,而经典ASP则用来显示返回的信息。WSC返回字符串值、ADO记录集,有时还会返回vbscript对象。
目前,我们正在尝试把WSC里面的VBscript换成Python(pyscript),这样至少用的语言是现代的,功能也更多(比如SOAP、ORM解决方案或者Memcached)。
在经典ASP中使用Python代码是可行的,方法是用pywin32并把Python注册为脚本语言,但我们遇到了两个基本问题:
在WSC中,使用“implements”标签应该能让所有IIS的标准对象(比如服务器、会话、请求、响应等)在WSC内部可用。但在使用Python时,这似乎不太管用。可能是我用的语法不对,或者需要在Python代码中添加一些额外的定义,但我找不到如何访问这些对象的方法。关于WSC的更多信息可以查看这个链接:http://aspalliance.com/414
当ASP页面出现错误时,浏览器会显示错误追踪信息,一切都很好。然而,如果WSC内部出现错误,浏览器几乎没有反馈。当使用VBscript时,Windows允许开发者选择调试工具,在我们的情况下,Visual Studio会启动并显示错误及其所在的行。这在本地开发时有效(也就是说本地开发机器上运行IIS)。但在使用Python时,什么都不会发生,只会在浏览器中显示一个非常模糊的信息,比如:
错误 '80020009' 发生了异常。
我尝试了不同的方法来解决这个问题;我试着导入win32traceutil并打开一个跟踪收集窗口。奇怪的是,它能捕捉到我所有的print()语句,但捕捉不到Python的错误信息。感觉好像stdout被捕捉了,但stderr没有。如果有其他方法可以在Python中重定向或显示错误信息,我也想尝试。我甚至考虑过使用一个很大的try..except,但这不仅风格很差,而且WSC里面有很多独立的函数,这样就意味着每个函数都要实现try..except。我真的不想这样做。
如果有人能帮我解决这两个问题(尤其是第二个问题对我们公司使用Python来说是个大障碍),我将非常感激。如果有其他方法能让Python的错误追踪信息可见,那将是一个很大的进步。
顺便说一下,我已经在不同的邮件列表上发布了这个问题,包括pywin32的邮件列表,但到现在为止还没有人能帮我们。
所以,求助于stackoverflow,你是我唯一的希望……
谢谢大家,
Erik
下面是一个非常简单的例子,包括一个ASP页面和一个Python WSC,ASP页面实例化WSC并调用其中的一些函数。Response.write不会工作,因为某种原因Response对象无法使用(问题1),而且如果Python代码中有错误,浏览器不会显示追踪信息或任何清晰的信息(问题2)。当然,代码需要在IIS下运行,并且需要安装Python和PyWin32(或者Activestate Python发行版,它已经包含了PyWin32)。
python.wsc:
<?xml version="1.0" encoding="Windows-1252" ?>
<component>
<?component error="true" debug="true"?>
<registration
description="python"
progid="python.WSC"
version="1.00"
classid="{F236F59E-3F6F-44EA-A374-DBFA9F90ECB3}"
</registration>
<public>
<method name="testmethod">
</method>
<method name="helloWho">
<PARAMETER name="who"/>
</method>
</public>
<implements type="ASP" id="ASP"/>
<script language="Python">
<![CDATA[
def testmethod():
Response.Write('output of results converted to a string')
def helloWho(who):
return "Hello "+who+"!"
]]>
</script>
</component>
ASP页面:
<%@ Language=VBscript %>
<%
set pythonwsc= GetObject("script:"&Server.MapPath("./python.wsc"))
response.write(pythonwsc.helloWho("world")&"<br>")
pythonwsc.testmethod()
%>
1 个回答
关于第二点,你需要在调用组件的VBScript中捕获异常。WSC其实就是一个COM组件。暂时不考虑在调用WSC时运行的Python,它就是一个COM组件。
在调用这个组件时可能会出现错误。调用可能会失败的组件时,使用错误处理是个好习惯。在VBScript中,这意味着要用“On Error Resume”或者其他类似的方式。
在JavaScript中,这意味着要用try..catch语句。
顺便问一下:为什么在WSC中使用Python?为什么不直接用JScript呢?JScript更主流,而且也相对现代。