Python脚本和一个win32程序之间的通信(用Delphi开发)

Posted

技术标签:

【中文标题】Python脚本和一个win32程序之间的通信(用Delphi开发)【英文标题】:Communication between Python script and a win32 program (developed in Delphi) 【发布时间】:2011-03-31 15:53:35 【问题描述】:

我是 Python 新手,我希望我的 Python 脚本能够与我的 Windows 程序(用 Delphi 开发,FWIW)进行通信。

基本上,Python 脚本会从其他数据源下载一组数据,对于下载的每条记录,我都会记录下来并告诉 Windows 程序。对于日志记录,如果可能,我将使用 Python 标准日志记录库,但是告诉 win32 程序以便向最终用户显示下载过程的最简单的方法是什么?

注意:我知道Python4Delphi,但它没有很好的记录,我想让事情变得简单。

编辑1:将只有一个Delphi exe和多个python脚本。

谢谢。

【问题讨论】:

Delphi 程序如何获取数据?它会读取文件吗? 嗨大卫,你问的就是我要问的;) 【参考方案1】:

如果您的 Delphi 程序是执行 Python 程序的程序,那么您可以简单地使用脚本write progress messages to standard output,也可以使用read them in your Delphi program。 (如果你这样做,那么一个程序是 Python 另一个是 Delphi 并不重要。任何一个程序都可以用你想要的任何语言编写。)

【讨论】:

谢谢 Rob,但我想知道我们是否可以调用 CreateProcess in a thread 来运行 python 脚本?因为只有一个Delphi exe和多个python脚本。 当然。这并不重要,因为 CreateProcess 创建了一个新进程,与调用它的线程完全无关。您可能关心的是之后运行 以接收脚本输出的代码。你可以在线程中运行它,或者你可以从一个线程中处理它们。 (我刚刚注意到我链接到的问题中的答案是错误的;它会等待整个过程终止,然后再读取它的任何输出,这有多种原因是错误的。如果你走这条路,请发布一个新的问题:如何读取多个衍生进程的输出?) +1 建议,恕我直言,这是最好的,因为双方都获得了独立性;) 实际上受到了严重限制。您的程序必须输出所有内容,然后一次读取该输出。您不能以交互方式使用它,并且由于您的输出倾向于纯文本以外的其他内容,并且只有少量内容,因此它变得越来越不美观。 @Rob,为什么我要在线程中创建新的 python 进程,因为我想使用每个线程来运行并捕获 python 的输出,然后将其发送到主 UI 以显示给用户,正如 Warren P 所说,我将不得不以交互方式与 python 进行交流。【参考方案2】:

您可以使用命名管道或套接字在 Python 代码和 Delphi 代码之间进行通信。为了将 Python 连接到命名管道,您可以使用 ctypes(例如 here)。

或者,您可以在 Delphi 中创建一个 COM 组件并从 Python 调用它(ActivePython 包含您需要的所有 Windows 位)。

【讨论】:

谢谢Vinay,COM 太完整了。命名管道是个好主意!【参考方案3】:

我自己的想法:

也许在 Python 脚本中调用 PostMessage(WM_CopyData)?但是在 Python 中调用该 win32 API 的最佳/标准方法是什么?

【讨论】:

如果你这样做了,那么你就不会发布 WM_COPYDATA。事实上,我很确定那会失败。您必须改为发送它。不过 Rob 的想法更好。 嗨大卫,为什么发布 WM_COPYDATA 会失败。 因为它需要将数据编组到另一个进程,我不相信异步消息会发生这种情况。【参考方案4】:

使用 PyWin32 包:http://pypi.python.org/pypi/pywin32 它使您可以访问整个 WinAPI。

您可以使用例如 COM: http://docs.activestate.com/activepython/2.7/pywin32/html/com/win32com/HTML/docindex.html

【讨论】:

使用 Win32。使用 COM。不是很具体。【参考方案5】:

我会在一侧制作一个简单的套接字服务器,在另一侧制作一个简单的套接字客户端。现在我可以让他们在同一台计算机上交谈,也可以通过局域网或互联网交谈。轻松有趣。

在 python 中,套接字编程库选项比比皆是,就像在 Delphi 中一样。 Indy 是 Delphi 中最常见的解决方案。 python 也内置了简单的套接字服务器,这些服务器非常健壮,可供您使用。

另外,由于 Python 可移植到 Windows 之外,您真的想将自己限制在命名管道和 COM 上,并将您的 Python 程序永远链接到 Windows 吗?

但是,如果您的脚本是 Delphi 程序的附属程序,那么 Python4Delphi(调用 Python 函数并使用其结果的能力)正是您所需要的,据我所知,它没有很好的文档记录,因为它非常简单使用,它不需要。在您第一次阅读 WriteLn('HelloWorld') 之前,您阅读了多少关于 WriteLn 的文档?

【讨论】:

嗨 Warren,socket 是个好主意,但即使在同一台计算机上,通信也必须通过防火墙,至少使用 ESET Smart Security。 关于Python4Delphi,从mmm-experts.com下载的版本不支持Python 2.7,但是从google code SVN server上检出的最新源码缺少几个源码文件。我什至无法编译... 好点。 IDLE(python IDE)使用套接字,即使在单个应用程序中,IDLE 功能也很痛苦 更新:python4delphi的作者刚刚修复了过时的依赖问题,现在我可以编译安装包了。

以上是关于Python脚本和一个win32程序之间的通信(用Delphi开发)的主要内容,如果未能解决你的问题,请参考以下文章

用 AutoHotkey 做为 win32 程序的库

与 Win32 服务的进程间通信

Win32 进程间通信分配

UWP C# 管道客户端无法连接到 Win32 C++ 管道服务器

使用 TCP 套接字 (WIN32 API) 创建的两个窗口之间的通信

用VC6.0实现上位机串口通信