python和vb的代码可以通⽤吗-VB6+Python混合编程(COM
组件)(转)
VB6+Python混合编程(COM组件)
0.2572018.05.10 16:01:23字数 553阅读 3725
Python的⽅便不⽤说,VB6做GUI的简单程度更不⽤说。⼆者混合编程的需求⼀直⾮常旺盛,但我苦苦搜寻了很久,始终未到合适的解决⽅案。
在很长⼀段时间内,我都是通过创建、读取、删除临时⽂件来在VB程序和Python程序间传递信息,⿇烦,且低级。(如下)
⽐如下⾯是⼀个典型的处理流程
1. VB创建需要处理的⽂本,并调⽤Python
python和vb的代码可以通用吗2. Python读取、处理⽂本,并将处理后的⽂本保存为ok.txt
3. VB在执⾏上⾯语句后进⼊死循环,等待ok.txt⽣成,完成后读取,继续流程
诸位请看,是不是⾮常符合⿇烦、低级的描述?但没有更好的解决⽅案,只有如此。
----激动⼈⼼的分界线-----
后来发现了⼀本书(python programming on win32,有兴趣的来看),终于让我发现了解决⽅法。COM组件!
COM is a technology from Microsoft that allows objects to communicate without the need for either object to know any details about the other, even the language it's implemented in.
看看本书某章节的总结:
We have seen examples of the various data types that can be passed back and forth between the two languages: numbers, strings, and arrays. The ability to pass multidimensional arrays allows you to move large amounts of data between the two languages without writing a lot of conversion code.
也不⽤说很多,不想看书的,看看下⾯这个我从书中摘抄的简短例⼦,就能知道该⽅法的核⼼之处。
在python⾥:
#需要先安装pipywin32模块
importpythoncomclassPythonUtilities:
_public_methods_=['SplitString']
_reg_progid_='PythonDemos.Utilities'_reg_clsid_=pythoncom.CreateGuid()def SplitString(self, val, item=None):importstringif item !=None:
item=str(item)
val=str(val)returnval.split(item)if __name__=='__main__':print ('Registering ')ister
ister.UseCommandLine(PythonUtilities)
以管理员⾝份执⾏上述代码。在注册成功后,COM组件会⼀直保留,不受开关机影响,因此可以在任意时候进⾏调⽤。最妙的是,你可以随时更新代码的函数部分,⽽⽆需重新注册,因此通常情况下,你只需要在注册时使⽤管理员权限。
在VB⾥:
Private SubForm_Load()Set PythonUtils = CreateObject("PythonDemos.Utilities")
response= PythonUtils.SplitString("Hello from VB")For Each Item InresponseMsgBoxItemNext
End Sub
上⾯说COM组件会⼀直保留,如果需要注销,可使⽤管理员权限执⾏命令⾏语句(py_name是上⾯python⽂件的名称)。
> python py_name.py --unregister
多余的不⽤说了,⼀试便知,这点代码⾜以解决诸多混合编程的难题。
该⽅法不仅适⽤于VB+Python,Office,Delphi,C++等等,均可使⽤。
上⾯的COM⽅法返回的是 python 的列表类型,怎样在 delphi 中使⽤呢?《Python Programming on Win32》7.3 ⼀节中提供了使⽤⽅法:
uses ComObj;varserver, ret: Variant;
i: integer;beginserver := CreateOleObject('PythonDemos.Utilities');
ret := server.SplitString('Hello from VB');for i := VarArrayLowBound(ret, 1) to VarArrayHighBound(ret, 1) do beginShowMessage(ret[i]);end;end;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论