使用Python与其他程序交互

使用Python与其他程序交互,python,automation,interop,concept,Python,Automation,Interop,Concept,我有一个想法,就是用Python编写一个程序,找到一首歌的歌词,我提供了这首歌的名字。我认为整个过程应该归结为以下几点。以下是我希望程序在运行时执行的操作: 提示我输入歌曲的名称 复制那个名字 打开web浏览器(例如google chrome) 将该名称粘贴到地址栏并查找有关歌曲的信息 打开包含歌词的页面 抄写歌词 运行文本编辑器(例如Microsoft Word) 粘贴歌词 用歌曲名称保存新文本文件 当然,我不是要代码。我只是想知道关于如何使用python与其他程序交互的概念或想法 更具体

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

  • 提示我输入歌曲的名称
  • 复制那个名字
  • 打开web浏览器(例如google chrome)
  • 将该名称粘贴到地址栏并查找有关歌曲的信息
  • 打开包含歌词的页面
  • 抄写歌词
  • 运行文本编辑器(例如Microsoft Word)
  • 粘贴歌词
  • 用歌曲名称保存新文本文件
当然,我不是要代码。我只是想知道关于如何使用python与其他程序交互的概念或想法

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

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

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

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


ttriet204

您应该查看一个名为
selenium
的包,用于与web浏览器进行交互

如果您确实想打开浏览器等,请查看。但这对你来说太过分了。Selenium用于模拟按钮点击等,用于测试各种浏览器上的网站外观等。对于这一点,Selenium不太过分

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

因此,使用
urllib
urllib2
或(甚至是heck)请求一个网页(学习如何将url组合到谷歌搜索或php
GET
歌词网站请求)。谷歌也有一个你可以利用的搜索引擎,来执行谷歌搜索

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

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


引文:Matteo Italia,g.d.d.c.来自OP上的评论

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

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

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

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

  • 有些应用程序除了GUI之外什么都没有,而且无法实现GUI自动化。您可以在较低的级别上完成此操作,方法是在Windows上通过
    pywin32
    发送WM_uu消息,在Mac上使用辅助功能API等,或者在较高的级别上使用库,如
    pywinauto
    ,或者可能在非常高的级别上使用
    selenium
    或为自动化特定应用而构建的类似工具

所以,你可以用任何东西来实现这一点,从selenium for Chrome和COM automation for Word,到自己制作所有WM_uu消息。如果这是一个学习练习,问题是你今天想学习哪些东西


让我们从COM自动化开始。使用,您可以直接访问应用程序自己的脚本界面,而不必从用户手中控制GUI,了解如何导航菜单和对话框等
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.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()
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)
>>> find_lyrics()
from automa.api import *
#!/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'