Взаимодействие с другими программами с помощью Python

У меня есть идея написать программу с использованием Python, которая найдет лирику песни, имя которой я предоставил. Я думаю, что весь процесс должен сводиться к паре вещей ниже. Вот что я хочу, чтобы программа делала, когда я ее запускаю:

  • подскажите мне ввести название песни
  • копировать имя
  • откройте веб-браузер (например, google chrome)
  • вставьте это имя в адресную строку и найдите информацию о песня
  • откройте страницу, содержащую текст
  • копировать текст
  • запустите текстовый редактор (например, Microsoft Word)
  • вставить текст
  • сохранить новый текстовый файл с название песни

Я не прошу код, конечно. Я просто хочу знать понятия или идеи о том, как использовать Python для взаимодействия с другими программами

чтобы быть более конкретным, я думаю, что хочу знать, пример fox, просто как мы указываем, где находится адресная строка в Google Chrome и говорим python вставить имя там. Или как мы говорим python, как Скопировать текст, а также вставить его в лист Microsof Word, а затем сохранить его.

Я читал (я все еще читаю) несколько книг по Python: Byte of python, Learn python The hard way, Python для чайников, начиная разработку игр с Python и Pygame. Тем не менее, я обнаружил, что кажется, что я только (или почти только) учусь создавать программы, которые работайте над собой (я не могу сказать своей программе, что я хочу делать с другими программами, которые уже установлены на моем компьютере)

Я знаю, что мой вопрос как-то звучит довольно глупо, но я действительно хочу знать, как это работает, как мы говорим Python regconize, что эта часть браузера Google chrome является адресной строкой и что она должна вставить имя песни в нее. Вся идея взаимодействия python с другой программой действительно очень расплывчата для меня, и я просто чрезвычайно хочу понять это.

спасибо всем, кто тратит свое время на чтение моего столь долгого вопроса.

ttriet204

5 ответов


если то, что вы действительно ищете, является хорошим предлогом, чтобы научить себя взаимодействовать с другими приложениями, это может быть не лучшим. Веб-браузеры грязные,сроки будут непредсказуемыми и т. д. Итак, вы взяли на себя очень трудную задачу-и это было бы очень легко, если бы вы сделали это обычным способом (поговорите с сервером напрямую, создайте текстовый файл напрямую и т. д. все, не касаясь каких-либо других программ).

но если вы хотите, чтобы взаимодействовать с другими приложениями, есть разнообразие различных подходов, и который подходит зависит от видов приложений, с которыми вам нужно иметь дело.

  • некоторые приложения предназначены для автоматизации извне. В Windows это почти всегда означает, что они COM-интерфейс, обычно с интерфейсом IDispatch, для которого вы можете использовать pywin32com-обертки; на Mac это означает интерфейс AppleEvent, для которого вы используете ScriptingBridge или appscript; на других платформах нет универсального стандарта. Т. е. (но, вероятно, не Chrome) и Word имеют такие интерфейсы.

  • некоторые приложения имеют интерфейс без GUI-будь то командная строка, которую вы можете управлять с popen, или DLL / SO / DYLIB вы можете загрузить через ctypes. Или, в идеале, кто-то уже написал привязки Python для вас.

  • некоторые приложения не имеют ничего, кроме GUI, и нет никакого способа сделать автоматизацию GUI. Вы можете сделать это на низком уровне, создавая сообщения WM_ для отправки через pywin32 в Windows, используя API специальных возможностей на Mac и т. д. или на несколько более высоком уровне с библиотеками как pywinauto, или, возможно, на очень высоком уровне selenium или аналогичные инструменты, созданные для автоматизации конкретных приложений.

Итак, вы можете сделать это с чем угодно, от selenium для Chrome и COM automation для 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, вы можете увидеть кучу примеров. Однако вы можете заметить, что они написаны в VBScript. И если вы посмотрите на учебники, все они написаны для VBScript (или более старого VB). И документация для большинства приложений написана для VBScript (или VB, .NET или даже низкоуровневого COM). И все учебники, которые я знаю для использования com-автоматизации от Python, например Быстрый старт на стороне клиента COM и Python, написаны для людей, которые уже знают об автоматизации COM, и просто хотят знать, как это сделать с Python. Тот факт, что Microsoft постоянно меняет название всего, делает его еще сложнее искать-как бы вы догадались, что googling для Ole automation, ActiveX scripting, Windows Scripting House и т. д. имеет ли что-нибудь общее с изучением автоматизации COM? Итак, я не уверен, что рекомендовать для начала. Я могу обещать, что все так просто. посмотрите на этот пример выше, как только вы узнаете всю ерунду, но я не знаю, как преодолеть это начальное препятствие.

в любом случае, не каждое приложение является автоматизированным. И иногда, даже если это так, описание действий GUI (что пользователь будет нажимать на экран) проще, чем думать с точки зрения объектной модели приложения. "Выбрать третий абзац" трудно описать в терминах GUI, но "выбрать весь документ" легко-просто нажмите control-A или перейдите в меню редактирования и выбрать все. Автоматизация GUI намного сложнее, чем автоматизация COM, потому что вы либо должны отправить приложение те же сообщения, которые сама Windows отправляет для представления ваших действий пользователя (например, см."Уведомления Меню") или, что еще хуже, создавать сообщения мыши, такие как" go (32, 4) пикселей из левого верхнего угла, нажмите, мышь вниз 16 пикселей, нажмите еще раз", чтобы сказать"открыть меню "Файл", затем нажмите "Создать".

к счастью, есть такие инструменты, как pywinauto это обернуть оба виды автоматизации GUI, чтобы сделать его намного проще. И есть такие инструменты, как swapy что может помочь вам выяснить, какие команды вы хотите отправить. Если вы не женаты на Python, есть также такие инструменты, как AutoIt и Actions это даже проще, чем с помощью swapy и 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()

наконец, даже со всеми из этих инструментов веб-браузеры очень трудно автоматизировать, потому что каждая веб-страница имеет свои собственные меню, кнопки и т. д. это не элементы управления Windows, а HTML. Если вы не хотите пройти весь путь до уровня "переместить мышь на 12 пикселей", с этим очень сложно справиться. Вот где selenium входит-это скрипты веб-GUIs так же, как pywinauto скрипты Windows GUIs.


следующий скрипт использует 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)

чтобы попробовать его для себя, загрузите Automa.zip от его страница скачать и распаковать, например, c:\Program Files. Вы получите папку под названием Automa 1.1.2. Запустить Automa.exe в этой папке. Скопируйте код выше и вставьте его в Аутома щелкнув правой кнопкой мыши в окне консоли. Нажмите Enter дважды, чтобы избавиться от последнего ... в окне и вернуться в в строке >>>. Закройте все остальные открытые окна и введите

>>> find_lyrics()

это выполняет необходимые шаги.

Automa является библиотекой Python: чтобы использовать его как таковой, вы должны добавить строку

from automa.api import *

в верхней части скриптов и файла library.zip из каталога установки Automa в переменную среды PYTHONPATH.

если у вас есть какие-либо другие вопросы, просто дайте мне знать :-)


вот реализация в Python комментарий@Matteo Italia:

вы подходите к проблеме с "точки зрения пользователя", когда вы следует подходить к нему с "точки зрения программиста"; вам не нужно откройте браузер, скопируйте текст, откройте 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')

пример

$ 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'

если вы действительно хотите открыть браузер и т. д., Посмотрите на селен. Но для ваших целей это перебор. Селен используется для имитации щелчков кнопок и т. д. Для тестирования внешнего вида веб-сайтов в различных браузерах и т. д. механизировать меньше перебора для этого

то, что вы действительно хотите сделать, это понять, как браузер (или любая другая программа) работает под капотом, т. е. когда вы нажимаете на мышь или набираете на клавиатуре или нажимаете Save, что программа работает за кулисами? Это закулисная работа, которую вы хотите, чтобы ваш код python делал.

используйте urllib, urllib2 или requests (или даже scrapy), чтобы запросить веб-страницу (узнайте, как собрать url-адрес для поиска google или php GET запрос веб-сайта, текст). Google также имеет поиск API что вы можете воспользоваться, чтобы выполнить поиск google.

как только вы имеете ваши результаты из вашего запроса страницы, проанализируйте его с помощью xml, beautifulsoup, lxlml и т. д. и найдите раздел результата запроса, в котором есть информация, которую вы ищете.

теперь, когда у вас есть текст, самое простое, что нужно сделать, это открыть текстовый файл и сбросить текст там и записать на диск. Но если вы действительно хотите сделать это с MS Word, откройте doc файл в блокноте или notepad++ и посмотрите на его структуру. Теперь используйте python для создания документа с аналогичной структурой, в котором содержание будет загружены тексты песен.
Если этот метод терпит неудачу, вы можете посмотреть в pywinauto или такие, чтобы автоматизировать вставку текста в MS Word doc и нажав на Save

образец цитирования: Matteo Italia, g.d.d.c из комментариев к ОП


вы должны посмотреть в пакет под названием selenium для взаимодействия с веб-браузерами