我打算在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文件中,但我觉得它们很难与之合作,我想尽可能避免这种情况。
答案 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()
%>