python和vb的代码可以通用吗-VB6+Python混合编程(COM组件)(转)

VB6+Python混合编程(COM组件)

0.2572018.05.10 16:01:23字数 553阅读 3725

Python的方便不用说,VB6做GUI的简单程度更不用说。二者混合编程的需求一直非常旺盛,但我苦苦搜寻了很久,始终未找到合适的解决方案。

在很长一段时间内,我都是通过创建、读取、删除临时文件来在VB程序和Python程序间传递信息,麻烦,且低级。(如下)

比如下面是一个典型的处理流程

webp

1. VB创建需要处理的文本please.txt,并调用Python

webp

2. Python读取、处理文本,并将处理后的文本保存为ok.txt

webp

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 COM server...')importwin32com.server.register

win32com.server.register.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;

类似地,如果需要向COM中传入python的LIST数据类型,可以在delphi中使用 Variant 类型(参见《Delphi中的变体Variant数组相关函数》 https://www.cnblogs.com/c2soft/articles/11660228.html )构建数组,然后传入COM中。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值