探索Python在Active Scripting环境中的应用
1. Active Scripting简介
Active Scripting是微软基于COM的技术,允许应用程序接入不同的宏或脚本语言。用户可选择自己熟悉的语言,应用程序无需了解具体脚本语言细节,语言甚至可以在应用程序编写后再添加对Active Scripting的支持。
常见的应用示例有微软的Internet Explorer(IE)和Internet Information Server(IIS)。IE支持客户端脚本,HTML文件可嵌入任意语言的脚本代码,浏览器显示页面时执行代码;IIS的Active Server Pages(ASP)支持Active Scripting,代码同样嵌入HTML文件,但在服务器端执行后再将最终HTML发送给客户端。
许多微软应用开始支持Active Scripting,通常标配VBScript和JScript语言实现,文档和示例代码也多使用这些语言。实际上,很多用户不知道还能使用其他语言,如Python及其丰富的库,能充分发挥这些应用的优势。
2. 注册Python Active Script支持
安装Python Win32扩展时,Python Active Scripting实现会自动注册。若需手动安装,可运行Python脚本
python\win32comext\axscript\client\pyscript.py
,可从Windows资源管理器、PythonWin或命令提示符运行该脚本。
3. Python与流行的微软应用
3.1 Internet Explorer
IE 4及以上版本通过在HTML中嵌入脚本代码支持Active Scripting。HTML解析和渲染时,检测到代码并加载相应语言执行。脚本代码用
<SCRIPT>
和
</SCRIPT>
标签分隔。
示例代码:
<SCRIPT>
alert("Hello there")
</SCRIPT>
默认语言为VBScript,若要使用Python,需指定语言:
<SCRIPT Language=Python>
alert("Hello there")
</SCRIPT>
alert()
函数并非Python内置函数,是IE加载Python时提供的全局函数,体现了应用向语言暴露对象模型的方式。
IE暴露的对象模型类似动态HTML对象模型,有
window
、
document
等对象,可获取浏览器信息或执行操作。
然而,Python需安装在每个客户端PC上,且在IE环境中运行时,Python会受到限制,如无法导入扩展模块、打开本地文件、创建套接字等。
以下是一个包含表单和按钮的HTML示例,展示VBScript和Python事件处理的差异:
<FORM NAME="TestForm">
<!-- A single text control all the buttons will use -->
<INPUT TYPE="Text"
NAME="txtControl"
>
<!-- VBScript using inline event handling -->
<INPUT NAME="butVB"
TYPE="Button"
VALUE="VB Script"
OnClick="txtControl.value=document.location"
>
<!-- Python using inline event handling -->
<INPUT NAME="butPyl"
TYPE="Button"
VALUE="Python inline"
OnClick="TestForm.txtControl.value=document.location"
LANGUAGE=Python
>
<!-- Python using an implicit event handler -->
<INPUT NAME="butPy2"
TYPE="Button"
VALUE="Python implicit"
>
<!-- Now the code for the implicit handler -->
<SCRIPT LANGUAGE=Python>
# Note we can not indent this block,
# as the leading whitespace will upset Python
def butPy2_onClick():
TestForm.txtControl.value=document.location
</SCRIPT>
</FORM>
该示例表明,VBScript可直接引用对象,Python需显式命名对象,且在所有Active Scripting应用中,Python代码对空格敏感。
Python事件处理遵循VBScript和JScript程序员熟悉的约定,可内联处理或通过函数名处理。
3.2 Internet Information Server
IIS是支持通用网关接口(CGI)的Web服务器,还支持ASP,使用Active Scripting实现比CGI更丰富的脚本模型。
ASP嵌入脚本代码的方式与IE类似,使用
<SCRIPT>
标签,可添加
RunAt=Server
属性指定在服务器端运行。此外,还支持
<% %>
和
<%= %>
标签。
示例代码:
<SCRIPT RunAt=Server Language=Python>
# This code will run at the server
</SCRIPT>
<SCRIPT Language=Python>
# This code will run at the client
</SCRIPT>
ASP暴露的对象模型与IE不同,如
alert()
函数在ASP对象模型中不存在。
ASP允许Python无限制运行,可指定默认语言,如
<% LANGUAGE=Python %>
。
ASP暴露的关键对象如下表所示:
| Object | Description |
| ---- | ---- |
| Application | 脚本运行的ASP应用,是共享某些状态和信息的ASP文件集合 |
| ObjectContext | 暴露ASP背后的事务机制 |
| Request | 表示客户端浏览器建立连接时传递给服务器的值 |
| ASPError | 包含ASP错误信息 |
| Response | 向客户端发送输出 |
| Server | 表示ASP服务器,可查询信息和执行命令 |
以下是一个使用
Server
、
Response
和
Request
对象的示例:
<!--
ServerSample.asp - an example of Python
and Active Scripting
-->
<%$cs:Language=Python %>
<%
# Save the URL into a local variable
url = Request.ServerVariables("PATH_INFO")
%>
<H2>Current Document</H2>
The URL to this file is <pre><%= url %></pre><p>
The local path to this URL is <pre><%= Server.mappath(url) %></pre>
<H2>Client Request Headers</H2>
<%
for key in Request.ServerVariables:
Response.Write("%s=%s<br>" % (key, Request.ServerVariables(key)))
%>
Response.Write()
方法向客户端发送输出,Python的
print
语句不会被脚本引擎重定向。
配置IIS运行脚本的步骤如下:
1. 在安装IIS的机器上启动Internet服务管理器。
2. 定位并选择ASP服务器下的默认Web服务器条目。
3. 选择“操作” -> “新建” -> “虚拟目录”,启动新建虚拟目录向导。
4. 输入
PythonTest
作为访问虚拟目录的别名,选择“下一步”。
5. 输入包含测试或示例
.asp
文件的目录物理路径,选择“下一步”。
6. 选择新目录的权限,默认选项即可,选择“完成”。
配置完成后,可通过在IE中输入
http://localhost/PythonTest/ServerSample.asp
运行脚本。
3.3 Windows Scripting Host
Windows Scripting Host(WSH)暴露的对象模型适合用Windows批处理文件完成的任务,常用于Windows管理和运行登录脚本。
WSH包含在Windows 98和2000中,Windows 95和NT可从
http://msdn.microsoft.com/scripting/
获取。它有两个可执行文件:
cscript.exe
(命令行工具)和
wscript.exe
(GUI应用)。
WSH使用简单文本文件保存脚本代码,Python文件扩展名为
.pys
,语法与Python源文件相同,但直接用Python执行时,WSH暴露的对象模型不可用。
WSH 5版本支持的顶级对象如下表所示:
| Object | Description |
| ---- | ---- |
| WScript | 包含脚本执行信息或WSH版本信息,有显示消息、创建COM对象等方法 |
| WshArguments | 通过
Wscript.Arguments
暴露,提供对脚本参数的访问 |
| WshShell | 提供对Windows Shell API快捷方式等方面的访问 |
| WshShortcut | 表示文件系统快捷方式 |
| WshUrlShortcut | 表示URL快捷方式 |
| WshCollection | 通用集合,提供共享驱动器、打印机连接等列表 |
| WshEnvironment | 提供对Windows环境变量的访问 |
| WshSpecialFolders | 表示Windows特殊文件夹,如桌面或收藏夹位置 |
以下是一个简单的Python示例:
# wsh.pys
# A Windows Scripting Host file that uses Python.
WScript.Echo("The script name is", WScript.ScriptName)
if len(WScript.Arguments):
WScript.Echo("The first argument is", WScript.arguments(0))
net = WScript.CreateObject("Wscript.Network")
netInfo = net.EnumNetworkDrives()
WScript.Echo(netInfo[0], "=", netInfo[1])
可从命令提示符运行:
C:\Scripts>cscript wsh.pys Hello
也可使用GUI版本:
C:\Scripts>wscript C:\Scripts\wsh.pys Hello
在GUI版本中,
WScript.Echo()
调用以消息框形式显示。
Python可利用WSH的大部分对象,即使不在WSH环境中运行,如:
>>> from win32com.client import Dispatch
>>> net=Dispatch("Wscript.Network")
>>> netInfo=net.EnumNetworkDrives()
>>> print "%s=%s" % (netInfo[0], netInfo[1])
Z:=\\SKIPPY\d_drive
>>>
4. Active Debugging
Active Debugging是Active Scripting的流行扩展技术,允许在微软提供的单一调试环境中调试脚本,可跨多种语言单步调试。
微软提供两种Active Debugging环境:免费的Windows Script Debugger(可从
http://msdn.microsoft.com/scripting/
获取)和功能更丰富的Microsoft Visual Interdev(随Microsoft Visual C++提供,不可免费下载)。
使用Python时,直接使用调试器即可,但Active Debugging规范较新,存在一些问题,如无法在IE 4中调试脚本,可使用其他使用IE4控件的EXE(如PythonWin和
webrowser.py
示例)进行调试。此外,并非所有Active Scripting宿主都支持Active Debugging。
5. Active Scripting工作原理
Active Scripting是基于COM的技术,为最终用户提供对象模型。应用使用Active Scripting的一般过程如下:
1. 确定特定脚本块使用的语言,将语言引擎作为普通COM对象创建,如VBScript、JScript和Python的COM ProgIDs。
2. 向语言引擎传递一系列命名项,每个命名项是具有名称和属性的COM对象,属性包括是否为全局项和是否触发事件。
3. 语言引擎将命名项放入命名空间,触发事件的命名项设置事件处理机制,全局对象的方法和属性作为全局方法和属性可用。
4. 应用将脚本代码交给语言引擎执行,代码引用命名空间中的对象时,语言引擎对COM IDispatch指针进行标准COM调用。
以IE为例,加载Python引擎时传递标准项和与HTML内容相关的附加项,部分项可触发事件,只有少数被视为全局项,如
Window
对象被指定为全局,有
alert()
方法。
内部实现使用普通COM概念,方法调用和属性引用通过
IDispatch
完成,事件处理使用
IConnectionPoint
接口,Python COM框架完全支持。
6. Python中的Active Script托管
可在Python应用中集成Active Scripting,步骤如下:
1. 创建
PyIActiveScriptSite
对象,
win32com.axscript.server.axsite
模块提供适合的Active Scripting Site基类,只需添加错误处理程序。
2. 定义对象模型,
win32com.axscript.server.axsite
模块允许指定字符串 - 对象对的字典,示例提供了简单的Python COM对象。
3. 加载代码并传递给所需的语言引擎,示例接受两个命令行参数:使用的语言名称和包含代码的文本文件名称。
示例代码:
# ActiveApp.py - Demonstration of a Python Active Scripting Application
import string, sys
from win32com.axscript import axscript
from win32com.axscript.server import axsite
import pythoncom
import win32com.server.util
import winerror
class MySite(axsite.AXSite):
# Our error handler will print to the console.
def OnScriptError(self, activeScriptError):
exc = activeScriptError.GetExceptionInfo()
print "Exception:", exc[1]
try:
sourceText = activeScriptError.GetSourceLineText()
except pythoncom.com_error:
sourceText = None
if sourceText is not None:
context, lineNo, charNo = activeScriptError.GetSourcePosition()
print sourceText
indent = " " * (charNo-1)
print indent + "ˆ"
return winerror.S_OK
# A named object for our namespace
# A normal Python COM object (minus registration info)
class Application:
_public_methods_ = [ 'Echo' ]
def Echo(self, *args):
print string.join(map(str, args))
# Our function that creates the site, creates the engine
# and runs the code.
def RunCode(engineName, code):
app = win32com.server.util.wrap( Application() )
# Create a dictionary holding our object model.
model = {
'Application' : app,
}
# Create the scripting site.
site = MySite(model)
# Create the engine and add the code.
engine = site.AddEngine(engineName)
engine.AddCode(code)
# Run the code.
engine.Start()
if __name__ == '__main__':
if len(sys.argv) < 3:
print "Usage: ActiveApp.py Language ScriptFile"
else:
code = open(sys.argv[2]).read()
RunCode( sys.argv[1], code )
测试脚本:
VBScript示例:
rem Sample VBScript code to be used with ActiveApp.py
sub JustForTheSakeOfIt
Application.Echo("Hello from VBScript")
end sub
rem Now call the Sub
JustForTheSakeOfIt
Python示例:
# Sample Python code to be used with ActiveApp.py
def JustForTheSakeOfIt():
Application.Echo("Hello from Python")
JustForTheSakeOfIt()
测试命令:
C:\Scripts>ActiveApp.py VBScript ActiveApp_VBScript.txt
C:\Scripts>ActiveApp.py Python ActiveApp_Python.txt
错误处理示例:
C:\Scripts>ActiveApp.py VBScript ActiveApp_Python.txt
错误处理程序正常工作,但错误信息会传播回调用函数,需添加异常处理。
综上所述,Python在Active Scripting环境中有广泛应用,可与多种微软应用结合使用,还可在自己的Python应用中集成Active Scripting,让用户选择特定语言。
探索Python在Active Scripting环境中的应用(续)
7. 总结与展望
在前面的内容中,我们详细探讨了Python在Active Scripting环境中的各种应用。从常见的微软应用如Internet Explorer、Internet Information Server和Windows Scripting Host,到Active Scripting的工作原理以及如何在Python应用中集成Active Scripting,我们对这一技术有了较为全面的了解。
7.1 优势总结
- 语言选择灵活性 :Active Scripting允许用户在不同应用中选择自己熟悉的脚本语言,Python凭借其丰富的库和简洁的语法,为用户提供了强大的脚本编写能力。
- 跨应用兼容性 :Python可以在多种微软应用中使用,如IE、IIS和WSH,并且在不同应用中遵循一定的规范,使得代码的复用和迁移成为可能。
- 可扩展性 :在自己的Python应用中集成Active Scripting,能够让用户根据需求选择不同的脚本语言,增加了应用的灵活性和可扩展性。
7.2 面临的挑战
- 环境依赖 :在某些应用中,如IE,Python需要安装在每个客户端PC上,这限制了其广泛使用。
- 调试问题 :Active Debugging规范较新,存在一些兼容性问题,部分Active Scripting宿主不支持调试功能。
- 错误处理 :在实际应用中,错误信息的传播和处理需要额外的关注,以确保应用的稳定性。
7.3 未来展望
随着技术的不断发展,Active Scripting和Python的结合有望在更多领域得到应用。以下是一些可能的发展方向:
-
更广泛的应用场景
:除了微软应用,未来可能会有更多的软件支持Active Scripting,Python作为一种通用的脚本语言,将有机会在更多场景中发挥作用。
-
调试功能的完善
:随着Active Debugging规范的成熟,调试工具将更加稳定和强大,解决目前存在的兼容性问题。
-
与其他技术的融合
:Python可以与其他技术如人工智能、大数据等结合,在Active Scripting环境中实现更复杂的功能。
8. 常见问题解答
为了帮助读者更好地理解和应用Python在Active Scripting环境中的知识,下面列出一些常见问题及解答。
8.1 安装与注册问题
- 问 :安装Python Win32扩展后,Python Active Scripting实现未自动注册怎么办?
-
答
:可以手动运行Python脚本
python\win32comext\axscript\client\pyscript.py,可从Windows资源管理器、PythonWin或命令提示符运行该脚本。
8.2 代码编写问题
-
问
:在IE中使用Python脚本时,为什么
alert()函数可以使用? -
答
:
alert()函数并非Python内置函数,是IE加载Python时提供的全局函数。IE向Python语言暴露其对象模型,alert()是其中一个可用的函数。 - 问 :在Python代码中,为什么要特别注意空格?
- 答 :虽然HTML对空格不敏感,但Python代码对空格敏感。在Active Scripting应用中,嵌入的Python代码必须遵循Python的语法规则,空格的使用会影响代码的正确性。
8.3 调试问题
- 问 :无法在IE 4中调试脚本怎么办?
-
答
:由于Active Desktop增强功能导致调试器报错,可以使用其他使用IE4控件的EXE进行调试,如PythonWin和
webrowser.py示例。
8.4 性能与兼容性问题
- 问 :在IIS中使用Python脚本,性能如何?
- 答 :Python在IIS中运行时,性能取决于具体的脚本实现和服务器配置。一般来说,Python的高效库和简洁的语法可以提高开发效率,但在高并发场景下,需要进行性能优化。
- 问 :不同版本的WSH对Python脚本的支持有差异吗?
- 答 :不同版本的WSH可能会对Python脚本的支持有所不同。WSH 5版本支持的对象模型在前面已经介绍,但在使用时,建议参考相应版本的文档,以确保代码的兼容性。
9. 总结
通过对Python在Active Scripting环境中的应用进行深入探讨,我们了解到这一技术为开发者和用户带来了诸多便利。Python的灵活性和丰富的库使得它在Active Scripting中具有很大的优势,无论是在微软应用中使用,还是在自己的应用中集成,都能满足不同的需求。
同时,我们也认识到在实际应用中可能会遇到一些挑战,如环境依赖、调试问题等。但随着技术的不断发展,这些问题有望得到解决。
希望本文能够帮助读者更好地理解和应用Python在Active Scripting环境中的知识,激发更多的创新和应用。在未来的开发中,不妨尝试将Python和Active Scripting结合起来,为应用带来更多的可能性。
下面是一个简单的mermaid流程图,展示了应用使用Active Scripting的一般过程:
graph LR
A[确定脚本语言] --> B[创建语言引擎]
B --> C[传递命名项]
C --> D[设置命名空间和事件处理]
D --> E[执行脚本代码]
这个流程图清晰地展示了应用在使用Active Scripting时的主要步骤,从确定语言到最终执行脚本代码,帮助读者更好地理解整个过程。
总之,Python在Active Scripting环境中的应用前景广阔,值得开发者深入探索和研究。通过不断学习和实践,我们可以充分发挥这一技术的优势,为软件开发带来更多的创新和价值。
超级会员免费看
16

被折叠的 条评论
为什么被折叠?



