发布
社区首页 >问答首页 >使用Python与其他程序交互

使用Python与其他程序交互
EN

Stack Overflow用户
提问于 2013-01-11 23:13:18
回答 4查看 95.1K关注 0票数 28

我想用Python编写一个程序,它会找到我提供的一首歌曲的歌词。我认为整个过程应该归结为以下几点。当我运行程序时,我希望程序能够这样做:

  • 提示我输入一首歌的名字
  • 复制这个名字
  • 打开网页浏览器(例如google)
  • 将该名称粘贴在地址栏中,并查找有关歌曲的信息。
  • 打开包含歌词的页面。
  • 抄写歌词
  • 运行文本编辑器(例如Microsoft )
  • 粘贴歌词
  • 用歌曲的名称保存新的文本文件

当然,我不是在要求密码。我只想知道关于如何使用python与其他程序交互的概念或想法。

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

我一直在读(我还在读)关于python的几本书: Python的字节,艰难地学习python,用Python和Pygame开始游戏开发。然而,我发现我似乎只(或者说几乎只)学会了创建能够自己工作的程序(我不能告诉我的程序用已经安装在我计算机上的其他程序做我想做的事情)。

我知道我的问题听起来有些傻,但我真的想知道它是如何工作的,我们告诉Python重新定义Google chrome浏览器的这一部分是地址栏,它应该在其中粘贴歌曲的名字。让python与另一个程序交互的整个想法对我来说真的很模糊,我非常想理解这一点。

谢谢大家,不管是谁花时间读我这么长的问题。

ttriet204

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-11 23:32:24

如果你真正研究的是一个很好的借口来教自己如何与其他应用程序交互,那么这可能不是最好的借口。Web浏览器是混乱的,时间将是不可预测的,等等。所以,你已经承担了一项非常艰巨的任务--如果你按照通常的方式(直接与服务器对话,直接创建文本文件等等),这将是非常容易的,所有这些都不涉及任何其他程序。

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

  • 有些应用程序是从外部自动设计的。在Windows上,这几乎总是意味着它们是COM接口,通常带有IDispatch接口,您可以使用pywin32的COM包装器;在Mac上,它意味着使用ScriptingBridgeappscript的AppleEvent接口;在其他平台上,没有通用标准。例如(但可能没有Chrome)和Word都有这样的接口。
  • 有些应用程序有一个非GUI界面--无论是可以使用popen驱动的命令行,还是可以通过ctypes加载的DLL/SO/DYLIB。或者,理想情况下,其他人已经为您编写了Python绑定。
  • 有些应用程序除了GUI什么都没有,没有办法实现GUI自动化。您可以在较低的级别上这样做,方法是在WM_上手工制作通过pywin32发送的消息,使用Mac上的可访问性API等等,或者在更高的级别上使用pywinauto等库,或者可能在非常高级别的selenium或类似的工具中实现特定应用程序的自动化。

所以,从Chrome的selenium到Word的COM自动化,再到自己制作所有的WM_消息,您都可以做到这一点。如果这是一次学习练习,那么问题在于你今天想要学的东西中的哪一件。

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

代码语言:javascript
代码运行次数:0
复制
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')

如果您查看Microsoft Word脚本,您可以看到一堆示例。但是,您可能会注意到它们是用VBScript编写的。如果您四处寻找教程,它们都是为VBScript (或更老的VB)编写的。大多数应用程序的文档都是为VBScript (或VB、.NET,甚至是底层COM)编写的。我所知道的用于使用Python的COM自动化的所有教程,比如快速启动客户端COM和Python,都是为那些已经了解COM自动化并且只想知道如何使用Python的人编写的。微软不断改变一切名称的事实使得搜索变得更加困难--你怎么会猜到谷歌搜索OLE自动化、ActiveX脚本、等等与学习COM自动化有什么关系呢?所以,我不知道该推荐什么开始。我可以保证,这一切都像上面的例子一样简单,一旦你学会了所有的废话,但我不知道如何跨越最初的障碍。

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

幸运的是,有一些像pywinauto这样的工具可以将这两种GUI自动化功能都封装起来,从而使它变得简单得多。还有一些像swapy这样的工具可以帮助您了解您想要发送的命令。如果您不喜欢Python,那么还有一些像AutoItActions这样的工具比使用swapypywinauto更容易,至少在开始的时候是这样。这样做,您的脚本的最后一部分看起来可能是:

代码语言:javascript
代码运行次数:0
复制
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与pywinauto脚本Windows一样。

票数 44
EN

Stack Overflow用户

发布于 2013-01-13 14:35:54

下面的脚本使用自动机来做您想做的事情(在Word 2010上测试):

代码语言:javascript
代码运行次数:0
复制
def find_lyrics():
    print 'Please minimize all other open windows, then enter the song:'
    song = raw_input()
    start("Google Chrome")
    # Disable Google's autocompletion and set the language to English:
    google_address = 'google.com/webhp?complete=0&hl=en'
    write(google_address, into="Address")
    press(ENTER)
    write(song + ' lyrics filetype:txt')
    click("I'm Feeling Lucky")
    press(CTRL + 'a', CTRL + 'c')
    press(ALT + F4)
    start("Microsoft Word")
    press(CTRL + 'v')
    press(CTRL + 's')
    click("Desktop")
    write(song + ' lyrics', into="File name")
    click("Save")
    press(ALT + F4)
    print("\nThe lyrics have been saved in file '%s lyrics' "
          "on your desktop." % song)

要自己尝试一下,请从Automa.zip的下载页面下载并解压缩到,比如说,c:\Program Files。您将得到一个名为Automa 1.1.2的文件夹。在该文件夹中运行Automa.exe。通过右键单击控制台窗口,复制上面的代码并粘贴到Automa中.按Enter两次以摆脱窗口中的最后一个...,然后返回提示符>>>。关闭所有其他打开的窗口并键入

代码语言:javascript
代码运行次数:0
复制
>>> find_lyrics()

这将执行所需的步骤。

Automa 是Python库:要像这样使用它,必须添加行

代码语言:javascript
代码运行次数:0
复制
from automa.api import *

从Automa的安装目录到您的环境变量library.zip到脚本和文件PYTHONPATH的顶部。

如果你还有其他问题,请告诉我:-)

票数 15
EN

Stack Overflow用户

发布于 2013-01-11 23:28:58

如果您真的想打开浏览器等,请查看。但为了你的目的那太过分了。Selenium用于模拟按钮单击等,以测试各种浏览器上的网站外观,等等。机械化对此不太过分。

您真正想要做的是了解浏览器(或任何其他程序)如何在引擎盖下工作,即当您单击鼠标或在键盘上键入或按下Save时,程序在幕后做什么?您希望您的python代码能够完成这些幕后工作。

因此,可以使用urlliburllib2requests (或者见鬼,甚至是scrapy)来请求一个网页(学习如何将url放在谷歌搜索或歌词网站的php GET请求中)。谷歌也有一个搜索API,你可以利用它来执行谷歌搜索。

获得页面请求的结果后,使用xmlbeautifulsouplxlml等对其进行解析,并找到包含所需信息的请求结果部分。

既然你有了歌词,最简单的方法就是打开一个文本文件,然后把歌词转储到里面,然后写到磁盘上。但是如果您真的想使用MS,那么在记事本或doc中打开一个notepad++文件并查看它的结构。现在,使用python构建一个类似结构的文档,其中的内容将是下载的歌词。

如果此方法失败,您可以查看碧昂斯或类似的内容,以自动将文本粘贴到method文档并单击Save

引文:意大利Matteo,g.d.d.c,摘自对“任择议定书”的评论

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14288177

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档