在ASP中 - 为什么我可以从vbscript调用python函数而不是反之亦然?

时间:2010-01-28 19:17:05

标签: python vbscript asp-classic

我打算在Python中为遗留的ASP应用程序编写一些新代码,但我遇到了一些奇怪的行为。如果我在python中编写一个函数,我可以很容易地从VBScript块中调用它。但是,如果我尝试从python调用VBScript中定义的函数,我会收到错误:

Python ActiveX Scripting Engine error '80020009'

Traceback (most recent call last): File "<Script Block >", line 3, in <module> PrintVBS() NameError: name 'PrintVBS' is not defined

/test.asp, line 20

以下是一个展示问题的快速示例:

<script language="Python" runat="server">
def PrintPython():
    Response.Write( "I'm from python<br>" )
</script>

<script language="vbscript" runat="server">
Sub PrintVBS()
    Response.Write( "I'm from VBScript<br>" )
End Sub
</script>

<script language="vbscript" runat="server">
PrintVBS()
PrintPython()
</script>


<script language="python" runat="server">
PrintPython() # code is fine up to here, 
PrintVBS() # no error if you comment this line
</script>

有没有人对这种行为有任何见解?任何解决方法?

注意,我知道我可以将我的vbscript代码放在WSC文件中,但我觉得它们很难与之合作,我想尽可能避免这种情况。

2 个答案:

答案 0 :(得分:3)

这可能与order in which the script tags are processed

有关

在这种情况下,似乎首先处理包含python代码的脚本标记,然后处理带有vbscript的脚本标记。结果是您尝试在可用之前调用PrintVBS()。

如果要将默认语言更改为python,则可能会出现反向错误。

答案 1 :(得分:1)

我正在做同样的事情。我似乎通过使用Python注册回调来获得成功(即明确告诉Python有关该函数)。诀窍是VBScript必须调用Python for Python才能回调到VBScript。

<%@LANGUAGE="VBSCRIPT"%>
<script language="Python" runat="server">
_PrintVBS = None
def register_printvbs(callback):
    global _PrintVBS
    _PrintVBS = callback

def PrintPython():
    Response.Write( "I'm from python<br>" )
</script>

<%
Sub PrintVBS()
    Response.Write( "I'm from VBScript<br>" )
End Sub
Call register_printvbs(GetRef("PrintVBS"))
PrintVBS()
PrintPython()
%>

<script language="python" runat="server">
def python_test():
    PrintPython() # code is fine up to here, 
    _PrintVBS() # no error if you comment this line
</script>

<%
Call python_test()
%>