В ASP - Почему я могу вызывать функции Python из VBScript, но не наоборот? - PullRequest
2 голосов
/ 28 января 2010

Я планирую написать новый код для устаревшего приложения ASP на Python, и я столкнулся с каким-то странным поведением. Если я пишу функцию в Python, я могу легко вызвать ее из блока VBScript. Однако, если я пытаюсь вызвать функцию, определенную в VBScript, из python, я получаю сообщение об ошибке:

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 ]

3 голосов
/ 28 января 2010

Вероятно, это связано с порядком , в котором обрабатываются теги сценария .

В этом случае кажется, что сначала обрабатываются теги сценария, содержащие код python, а затем теги vbscript. В результате вы пытаетесь вызвать PrintVBS () до того, как он станет доступен.

Если вы измените язык по умолчанию на python, вы, вероятно, получите обратную ошибку.

1 голос
/ 04 февраля 2011

Я делаю то же самое. Я, кажется, добился успеха, зарегистрировав обратный вызов с помощью Python (то есть явным образом сообщая Python о функции). Хитрость в том, что VBScript должен вызывать Python, чтобы 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()
%>
...