使用Python与其他程序交互

时间:2013-01-11 23:13:19

标签: python automation concept

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

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

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

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

我一直在阅读(我还在阅读)几本关于Python的书:python的字节,艰难的学习python,Python的傻瓜,Python和Pygame的开始游戏开发。但是,我发现我似乎只(或几乎只)学会创建自己运行的程序(我不能告诉我的程序用我已经安装在计算机上的其他程序做我想要的事情)

我知道我的问题在某种程度上听起来很愚蠢,但我真的想知道它是如何工作的,我们告诉Python重新定义Google Chrome浏览器的这一部分是地址栏的方式,它应该粘贴名称这首歌。使python与另一个程序交互的整个想法对我来说真的很模糊,我只是 非常想抓住那个。

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

ttriet204

5 个答案:

答案 0 :(得分:27)

如果你真正想要的是一个很好的借口来教自己如何与其他应用程序进行交互,这可能不是最好的。 Web浏览器很乱,时间不可预测等等。所以,你已经完成了一项非常艰巨的任务 - 如果你按照通常的方式做到这一点非常容易(直接与服务器通信,创建文本文件直接等,都不涉及任何其他程序)。

但是,如果您确实想与其他应用进行互动,则有多种不同的方法,这些方法取决于您需要处理的应用类型。

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

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

  • 有些应用程序只有GUI,而且没有办法进行GUI自动化。您可以在较低级别执行此操作,方法是在Windows上通过pywin32制作WM_消息,使用Mac上的辅助功能API等,或者使用pywinauto等库更高级别,或者可能是selenium或非常高级别的工具,用于自动化特定应用程序。

因此,您可以使用从selenium for Chrome和COM自动化Word到自己制作所有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')

如果你看一下Microsoft Word Scripts,你可以看到一堆例子。但是,您可能会注意到它们是用VBScript编写的。如果你四处寻找教程,它们都是为VBScript(或更老的VB)编写的。大多数应用程序的文档都是为VBScript(或VB,.NET,甚至是低级COM)编写的。我所知道的所有使用Python的COM自动化的教程,如Quick Start to Client Side COM and Python,都是为那些已经了解COM自动化的人编写的,并且只想知道如何从Python中完成它。微软不断更改所有内容的名称这一事实使搜索更加困难 - 您如何猜测OLE自动化,ActiveX脚本,Windows脚本之家等的Google搜索与学习COM自动化有什么关系?所以,我不确定推荐什么入门。我可以保证这一切都像上面那个例子一样简单,一旦你学会了所有的废话,但我不知道如何克服这个初始障碍。

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

幸运的是,像pywinauto这样的工具包含了两种GUI自动化内容,使其变得更加简单。还有像swapy这样的工具可以帮助您找出要发送的命令。如果您没有使用Python,那么还有AutoItActions等工具比使用swapypywinauto更容易,至少在您获得时开始。这样,脚本的最后一部分可能如下所示:

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 GUI相同。

答案 1 :(得分:15)

以下脚本使用Automa完全按照您的要求执行(在Word 2010上测试):

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)

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

>>> find_lyrics()

执行所需的步骤。

Automa is a Python library:要像这样使用它,你必须添加一行

from automa.api import *

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

如果您有任何其他问题,请告诉我: - )

答案 2 :(得分:11)

这是Python @Matteo Italia's comment的实现:

  

您正在从“用户角度”处理问题   应该从“程序员的角度”来接近它;你不需要   打开浏览器,复制文本,打开Word或其他任何内容,您需要   执行适当的HTTP请求,解析相关的HTML,   提取文本并将其写入Python内部的文件中   脚本。所有这些工具都可以在Python中找到(in   特别是你需要urllib2和BeautifulSoup)。

#!/usr/bin/env python
import codecs
import json
import sys
import urllib
import urllib2

import bs4  # pip install beautifulsoup4

def extract_lyrics(page):
    """Extract lyrics text from given lyrics.wikia.com html page."""
    soup = bs4.BeautifulSoup(page)
    result = []
    for tag in soup.find('div', 'lyricbox'):
        if isinstance(tag, bs4.NavigableString):
            if not isinstance(tag, bs4.element.Comment):
                result.append(tag)
        elif tag.name == 'br':
            result.append('\n')
    return "".join(result)

# get artist, song to search
artist = raw_input("Enter artist:")
song = raw_input("Enter song:")

# make request
query = urllib.urlencode(dict(artist=artist, song=song, fmt="realjson"))
response = urllib2.urlopen("http://lyrics.wikia.com/api.php?" + query)
data = json.load(response)

if data['lyrics'] != 'Not found':
    # print short lyrics
    print(data['lyrics'])
    # get full lyrics
    lyrics = extract_lyrics(urllib2.urlopen(data['url']))
    # save to file
    filename = "[%s] [%s] lyrics.txt" % (data['artist'], data['song'])
    with codecs.open(filename, 'w', encoding='utf-8') as output_file:
        output_file.write(lyrics)
    print("written '%s'" % filename)
else:
    sys.exit('not found')

实施例

$ printf "Queen\nWe are the Champions" | python get-lyrics.py 

输出

I've paid my dues
Time after time
I've done my sentence
But committed no crime

And bad mistakes
I've made a few
I've had my share of sand kicked [...]
written '[Queen] [We are the Champions] lyrics.txt'

答案 3 :(得分:5)

如果您真的想要打开浏览器等,请查看selenium。但这对你的目的来说太过分了。 Selenium用于模拟按钮点击等,以便在各种浏览器上测试网站的外观等。Mechanize对此不太重要

你真正想要做的是了解浏览器(或任何其他程序)如何在幕后工作,即当你点击鼠标或在键盘上输入或点击Save时,程序会做什么场景?你想要你的python代码就是这种幕后工作。

所以,使用urlliburllib2requests(或者,甚至scrapy)来请求网页(了解如何将网址整理到Google中搜索或歌词网站的php GET请求)。谷歌还有search API你可以利用它来进行谷歌搜索。

从您的网页请求中获得结果后,请使用xmlbeautifulsouplxlml等解析结果,并找到包含您所需信息的请求结果部分后。

现在你有了自己的歌词,最简单的方法是打开一个文本文件并将歌词转储到那里并写入磁盘。但如果你真的想用MS Word做,那么在记事本或记事本++中打开一个doc文件并查看其结构。现在,使用python构建一个结构相似的文档,其中的内容将是下载的歌词 如果此方法失败,您可以查看pywinauto或类似内容,以自动将文本粘贴到MS Word文档中并单击Save

引用:Matteo Italia,g.d.d.c来自对OP的评论

答案 4 :(得分:0)

您应该查看名为selenium的程序包,以便与Web浏览器进行交互