使用Python与其他程序交互

ttr*_*204 21 python automation concept

我想用Python写一个程序,它会找到我提供的一首歌的歌词.我认为整个过程应归结为以下几点.这些是我希望程序在运行时执行的操作:

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

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

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

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

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

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

ttriet204

aba*_*ert 29

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

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

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

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

  • 有些应用程序除了GUI之外什么都没有,而且无法进行GUI自动化.您可以通过制作WM_消息pywin32在Windows 上发送,使用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')
Run Code Online (Sandbox Code Playgroud)

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

无论如何,并非每个应用程序都是自动化的.有时,即使是这样,描述GUI动作(用户在屏幕上点击的内容)比根据应用程序的对象模型进行思考更简单."选择第三段"很难用GUI术语来描述,但"选择整个文档"很简单 - 只需点击控件-A,或者转到"编辑"菜单并选择"全部".GUI自动化比COM自动化要困难得多,因为您必须向应用发送与Windows本身发送的相同消息以表示您的用户操作(例如,请参阅" 菜单通知 "),或者更糟糕的是,制作鼠标消息,如"go"(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()
Run Code Online (Sandbox Code Playgroud)

最后,即使使用所有这些工具,Web浏览器也很难自动化,因为每个网页都有自己的菜单,按钮等不是Windows控件,而是HTML.除非你想一直到"移动鼠标12像素"的水平,否则很难处理这些问题.这就是selenium脚本Web GUI与pywinauto脚本Windows GUI 相同的方式.


Mic*_*ann 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)
Run Code Online (Sandbox Code Playgroud)

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

>>> find_lyrics()
Run Code Online (Sandbox Code Playgroud)

这将执行所需的步骤.

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

from automa.api import *
Run Code Online (Sandbox Code Playgroud)

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

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


jfs*_*jfs 11

以下是@Matteo Italia评论的 Python实现:

当您从"程序员角度"处理问题时,您正在从"用户角度"处理问题; 您不需要打开浏览器,复制文本,打开Word或其他任何内容,您需要执行相应的HTTP请求,解析相关的HTML,提取文本并将其写入Python脚本内的文件.所有这些工具都可以在Python中使用(特别是你需要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')
Run Code Online (Sandbox Code Playgroud)

$ printf "Queen\nWe are the Champions" | python get-lyrics.py 
Run Code Online (Sandbox Code Playgroud)

产量

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'


ins*_*get 5

如果您确实要打开浏览器等,请查看selenium。但这对于您的目的来说是太过分了。硒是用来模拟按钮点击等用于测试在不同浏览器的网站外观等机械化是矫枉过正较少此

您真正想做的是了解浏览器(或任何其他程序)Save如何在后台运行,即,当您单击鼠标或在键盘上键入或单击时,该程序在幕后做什么?您希望您的python代码执行此幕后工作。

因此,使用urlliburllib2requests(或赫克,甚至scrapy)来请求一个网页(了解如何将URL放在一起谷歌搜索或PHP GET歌词网站的要求)。Google还具有一个搜索API,您可以利用它执行Google搜索。

一旦你从你的页面请求有你的结果,与解析它xmlbeautifulsouplxlml,等,并找出与你后的信息请求结果的部分。

有了歌词后,最简单的操作就是打开一个文本文件,然后将歌词转储到该文件中并写入磁盘。但是,如果您真的想使用MS Word来执行此操作,请doc在notepad或notepad ++中打开一个文件,并查看其结构。现在,使用python构建具有类似结构的文档,其中内容将为下载的歌词。
如果此方法失败,则可以查看pywinauto或类似方法来自动将文本粘贴到MS Word文档中,然后单击Save

引用:Matteo Italia,gddc,来自OP的评论