如何在WSC中调试Python

1 投票
1 回答
765 浏览
提问于 2025-04-16 05:07

我们正在为一个大型的老旧网页应用程序编写经典ASP代码。现在使用WSC(Windows脚本组件)来把用户界面和业务逻辑分开,这样做效果不错;WSC里面包含了业务逻辑,而经典ASP则用来显示返回的信息。WSC返回字符串值、ADO记录集,有时还会返回vbscript对象。

目前,我们正在尝试把WSC里面的VBscript换成Python(pyscript),这样至少用的语言是现代的,功能也更多(比如SOAP、ORM解决方案或者Memcached)。

在经典ASP中使用Python代码是可行的,方法是用pywin32并把Python注册为脚本语言,但我们遇到了两个基本问题:

  1. 在WSC中,使用“implements”标签应该能让所有IIS的标准对象(比如服务器、会话、请求、响应等)在WSC内部可用。但在使用Python时,这似乎不太管用。可能是我用的语法不对,或者需要在Python代码中添加一些额外的定义,但我找不到如何访问这些对象的方法。关于WSC的更多信息可以查看这个链接:http://aspalliance.com/414

  2. 当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 个回答

0

关于第二点,你需要在调用组件的VBScript中捕获异常。WSC其实就是一个COM组件。暂时不考虑在调用WSC时运行的Python,它就是一个COM组件。

在调用这个组件时可能会出现错误。调用可能会失败的组件时,使用错误处理是个好习惯。在VBScript中,这意味着要用“On Error Resume”或者其他类似的方式。

在JavaScript中,这意味着要用try..catch语句。

顺便问一下:为什么在WSC中使用Python?为什么不直接用JScript呢?JScript更主流,而且也相对现代。

撰写回答