使用 Python 与其他程序交互

2023-12-15

我有一个想法,使用 Python 编写一个程序,该程序将找到我提供的歌曲的歌词。我认为整个过程应该归结为以下几件事。这些是我希望程序在运行时执行的操作:

  • 提示我输入歌曲名称
  • 复制那个名字
  • 打开网络浏览器(例如谷歌浏览器)
  • 将该名称粘贴到地址栏中并查找有关该歌曲的信息
  • 打开包含歌词的页面
  • 复制那句歌词
  • 运行文本编辑器(例如 Microsoft Word)
  • 粘贴歌词
  • 使用歌曲名称保存新的文本文件

当然,我不是要代码。我只是想了解如何使用python与其他程序交互的概念或想法

更具体地说,我想我想知道,例如,我们如何指出 Google Chrome 中的地址栏在哪里,并告诉 python 将名称粘贴到那里。或者我们如何告诉 python 如何复制歌词并将其粘贴到 Microsoft Word 的工作表中然后保存。

我一直在阅读(我仍在阅读)几本有关 Python 的书籍:《Python 简明》、《以困难的方式学习 Python》、《Python 傻瓜书》、《使用 Python 和 Pygame 开始游戏开发》。但是,我发现我似乎只(或几乎只)学会创建可以自行运行的程序(我无法告诉我的程序使用已安装在我的计算机上的其他程序执行我想要的操作)

我知道我的问题听起来相当愚蠢,但我真的想知道它是如何工作的,我们告诉 Python 识别 Google Chrome 浏览器的这一部分是地址栏的方式,并且它应该将歌曲的名称粘贴到它。让 python 与另一个程序交互的整个想法对我来说真的很模糊,我只是 非常想抓住这一点。

谢谢大家,无论谁花时间阅读我这么长的问题。

ttriet204


如果您真正正在寻找的是一个自学如何与其他应用程序交互的好借口,那么这可能不是最好的。 Web 浏览器很混乱,时间安排难以预测,等等。因此,您承担了一项非常艰巨的任务,而如果您按照通常的方式(直接与服务器对话,创建直接文本文件等,所有这些都无需接触任何其他程序)。

但是,如果您确实想与其他应用程序交互,有多种不同的方法,哪种方法合适取决于您需要处理的应用程序类型。

  • 有些应用程序被设计为从外部自动化。在 Windows 上,这几乎总是意味着它们是 COM 接口,通常带有 IDispatch 接口,您可以使用pywin32的 COM 包装器;在 Mac 上,它意味着 AppleEvent 接口,您可以使用它ScriptingBridge or appscript;在其他平台上没有通用标准。 IE(但可能不是 Chrome)和 Word 都有这样的界面。

  • 某些应用程序具有非 GUI 界面 - 无论是您可以使用的命令行popen,或者您可以通过加载的 DLL/SO/DYLIBctypes。或者,理想情况下,其他人已经为您编写了 Python 绑定。

  • 有些应用程序除了 GUI 之外什么都没有,而且没有办法绕过 GUI 自动化。您可以通过制作 WM_ 消息以通过以下方式发送来在较低级别上执行此操作pywin32在 Windows 上,在 Mac 等上使用可访问性 API,或者在更高级别上使用诸如pywinauto,或者可能处于非常高的水平selenium或用于自动化特定应用程序的类似工具。

因此,您可以使用任何东西来完成此操作,从用于 Chrome 的 selenium 和用于 Word 的 COM 自动化,到自己制作所有 WM_ 消息。如果这是一次学习练习,那么问题是您今天想学习哪些内容。


让我们从 COM 自动化开始。使用pywin32,您可以直接访问应用程序自己的脚本接口,而不必从用户那里控制 GUI,弄清楚如何导航菜单和对话框等。这是编写“Word 宏”的现代版本 - 宏可以是外部脚本而不是 Word 内部脚本,它们不必用 VB 编写,但它们看起来非常相似。脚本的最后一部分看起来像这样:

word = win32com.client.dispatch('Word.Application')
word.Visible = True
doc = word.Documents.Add()
doc.Selection.TypeText(my_string)
doc.SaveAs(r'C:\TestFiles\TestDoc.doc')

如果你看微软Word脚本,你可以看到一堆例子。但是,您可能会注意到它们是用 VBScript 编写的。如果您四处寻找教程,它们都是为 VBScript(或更旧的 VB)编写的。大多数应用程序的文档都是针对 VBScript(或 VB、.NET,甚至低级 COM)编写的。我所知道的所有关于使用 Python 中的 COM 自动化的教程,例如客户端 COM 和 Python 快速入门,是为那些已经了解 COM 自动化并且只是想知道如何从 Python 中执行此操作的人编写的。事实上,Microsoft 不断更改所有内容的名称,这使得搜索变得更加困难 — 您怎么认为在 Google 上搜索 OLE 自动化、ActiveX 脚本、Windows Scripting House 等与了解 COM 自动化有什么关系呢?所以,我不确定应该推荐什么来开始。我可以保证,一旦你学会了所有的废话,这一切就像上面的例子看起来一样简单,但我不知道如何克服最初的障碍。

无论如何,并不是每个应用程序都是自动化的。有时,即使是这样,描述 GUI 操作(用户在屏幕上单击的内容)也比根据应用程序的对象模型进行思考要简单。 “选择第三段”很难用 GUI 术语来描述,但“选择整个文档”很容易 - 只需按下 Control-A,或者转到“编辑”菜单并选择全部。 GUI 自动化比 COM 自动化困难得多,因为您必须向应用程序发送 Windows 本身发送的相同消息来表示您的用户操作(例如,请参阅“菜单通知”)或者更糟糕的是,制作鼠标消息,例如“从左上角开始 (32, 4) 像素,单击,鼠标向下移动 16 像素,再次单击”来表示“打开文件菜单,然后单击新建”。

幸运的是,有类似的工具pywinauto它将两种 GUI 自动化的东西包装起来,使其变得更加简单。还有像这样的工具swapy这可以帮助您找出要发送的命令。如果您不熟悉 Python,还有一些工具,例如AutoIt and Actions比使用更容易swapy and pywinauto,至少当你开始的时候。按照这种方式,脚本的最后部分可能如下所示:

word.Activate()
word.MenuSelect('File->New')
word.KeyStrokes(my_string)
word.MenuSelect('File->Save As')
word.Dialogs[-1].FindTextField('Filename').Select()
word.KeyStrokes(r'C:\TestFiles\TestDoc.doc')
word.Dialogs[-1].FindButton('OK').Click()

最后,即使使用所有这些工具,Web 浏览器也很难实现自动化,因为每个网页都有自己的菜单、按钮等,这些菜单、按钮等不是 Windows 控件,而是 HTML。除非你想一直下降到“将鼠标移动12像素”的级别,否则很难处理这些。那就是那里selenium进来 - 它编写 Web GUI 的方式与pywinauto编写 Windows GUI 脚本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Python 与其他程序交互 的相关文章

随机推荐

  • 将数据库中特定模式的所有内容授予 PostgreSQL 中的组角色

    使用 PostgreSQL 9 0 我有一个名为 staff 的组角色 并且希望向该角色授予特定模式中表的所有 或某些 权限 没有以下工作 GRANT ALL ON SCHEMA foo TO staff GRANT ALL ON DATA
  • 我如何学习如何在 bash 中正确引用?

    当我编写 bash 脚本时 我经常对引用和评估的规则感到困惑 我知道一些基础知识 比如 和 和 之间的区别 但我似乎仍然经常出错 并且不得不尝试用各种不同的方式来表达同一件事 我通常可以通过蛮力解决任何个人问题 但我认为我的概念模型必须以某
  • Windows Phone 7 - 电话呼叫连接和电话呼叫断开时触发的事件

    我正在为 Windows Mobile 7 编写一个应用程序 它需要有关 何时发出语音呼叫 和 何时挂断或断开语音呼叫 的信息 是否有任何 API 或事件 触发器可以为我提供此信息 当前的 SDK 不提供此功能 通常 由于沙盒环境默认不提供
  • FastAPI 重定向给出方法不允许错误

    我创建了一个登录路径 在其中发布表单数据并设置 cookie 设置cookie后 我重定向到 main 在那里我得到 detail Method Not Allowed 作为回应 app post login async def login
  • ViewChild - 无法在 Angular 2 RC 1 JavaScript 中工作

    ViewChild 无法在 Angular 2 RC 1 JavaScript 中工作 我用过
  • RibbonApplicationMenu:摆脱 AuxiliaryPane

    碰巧我正在开发的应用程序不对文档进行操作 因此不需要在应用程序菜单中显示最近打开的文档列表 但是 令人烦恼的是 没有现成的房产RibbonApplicationMenu隐藏未使用的类AuxiliaryPane 奇怪的是 该属性确实存在 但被
  • 单击关闭按钮时隐藏表单而不是关闭

    When a user clicks the X button on a form how can I hide it instead of closing it 我努力了this hide in FormClosing但它仍然关闭表单 L
  • Outlook 2013“运行脚本”规则已消失

    我在 Outlook 2013 中有一些工作规则 然而 在我的笔记本电脑前几天崩溃后 我无法再运行任何规则 它们根本不起作用 我什至没有收到调试通知 检查我的宏后 我发现当我尝试单击我拥有的任何脚本时 我不断收到消息 此操作在当前模式下不可
  • iOS XMPP 框架与 Openfire Server 获取所有注册用户

    for my IOS我正在使用的聊天应用程序Openfire服务器 我正在检索特定用户好友列表 但现在我想检索所有注册用户Openfire服务器 请帮助我并提前致谢 最后 我通过使用用户名搜索用户找到了替代答案 1 对于每个联系人 我都会添
  • 如何在高分辨率设备上使用媒体查询

    我制作了一个简单的响应式网站 或多或少 我使用过媒体查询 media only screen and max width 699 99px 现在我知道当分辨率小于 699 99px 时 这会激活其中的 css 所以在电脑上没问题 但在手机上
  • 散景,套索选择表更新

    我希望每个人都做得很好 我正在尝试开发 Bokeh 交互 选择散点图的一部分将更新表格 我使用了 Bokeh 文档中的大量示例代码 我的工作场所正在运行旧版本的 Bokeh 0 12 5 因此我必须更改自定义 JS 中的最后一行 从 s2
  • Pandas:使用 Append 添加新列并使另一个全为 NaN

    我大约一周前才开始学习 pandas 现在我一直在努力处理 pandas 数据框 我的数据如下所示 State NY CA Other Total Year 2003 450 50 25 525 2004 300 75 5 380 2005
  • 在 Pandas 中合并两行(一行有值,另一行 NaN)

    我知道以前也有人问过类似的问题 如何合并数据框中的两行pandas等 但我仍然在努力执行以下操作 除了包含许多行的 pandas 数据框 team token day1 day2 day3 day4 0 abc 1 NaN NaN NaN
  • 如何获取客户端 IP 地址的时区偏移量

    我想为我的网络应用程序获取客户 IP 地址的时区偏移量 我尝试过使用 Javascripts getTimezone 函数 但是 某些客户端的时区或时间设置不正确 我想获取偏移量并根据客户端的时区将一些信息返回给客户端 感谢您花时间阅读问题
  • send() 在 Ruby 中做什么?

    有人可以告诉我下面的片段是什么吗 obj send method name 是并且确实吗 send向类层次结构中的对象实例及其祖先发送消息 直到某个方法做出反应 因为它的名称与第一个参数匹配 实际上 这些行是等效的 1 send 2 1 2
  • 如何测试依赖于argparse的Python类?

    下面的粘贴包含来自三个单独的 Python 文件的相关片段 第一个是从命令行调用的脚本 它在给定某些参数的情况下实例化 CIPuller 发生的情况是脚本被调用 类似于 script py ci 其他参数将被 argparse 吞掉 第二个
  • 访问jar内的图像

    第一的 我知道已经存在各种关于如何访问 jar 文件内的图像的主题 第二 我尝试了很多选择 但没有一个不起作用 我当然知道我在某个地方犯了错误 你能帮助我理解我做错了什么吗 所以 我有一个名为 j 的原型项目 它只包含一个 java 类 C
  • 使用 Jackson 序列化时有条件地跳过对象

    我有一个像这样的课程 interface IHideable boolean isHidden class Address implements IHideable private String city private String st
  • Android Activity 在 4.3 设备上运行缓慢

    我开发了一个可以从网络传输视频的应用程序 我有一个活动列出了视频 包括它们的图标 标题和状态 新更新 每行都有一个视频缩略图 视频标题 然后有一个 新鲜 图标来指示它是新上传的 在模拟器中 这工作得相当好 在 2 3 和 4 0 3 HTC
  • 使用 Python 与其他程序交互

    我有一个想法 使用 Python 编写一个程序 该程序将找到我提供的歌曲的歌词 我认为整个过程应该归结为以下几件事 这些是我希望程序在运行时执行的操作 提示我输入歌曲名称 复制那个名字 打开网络浏览器 例如谷歌浏览器 将该名称粘贴到地址栏中