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

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

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

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

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

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

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

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

ttriet204


person ttriet204    schedule 11.01.2013    source источник
comment
Посмотрите на code.google.com/p/pywinauto. С его помощью я добился приличной автоматизации.   -  person g.d.d.c    schedule 12.01.2013
comment
Вы подходите к проблеме с точки зрения пользователя, тогда как вам следует подходить к ней с точки зрения программиста; вам не нужно открывать браузер, копировать текст, открывать Word или что-то еще, вам нужно выполнять соответствующие HTTP-запросы, анализировать соответствующий HTML, извлекать текст и записывать его в файл изнутри вашего скрипта Python. Все инструменты для этого доступны в Python (в частности, вам понадобятся urllib2 и BeautifulSoup).   -  person Matteo Italia    schedule 12.01.2013
comment
@Matteo, верно, но тестировщикам нужно думать о вещах с точки зрения пользователя.   -  person Cameron Sparr    schedule 12.01.2013
comment
И, в полном согласии с Маттео, если вы не пойдете по пути автоматизации, посмотрите wwwsearch.sourceforge.net/ механизировать.   -  person g.d.d.c    schedule 12.01.2013
comment
@CameronSparr: конечно, но это очень специфическая потребность - им нужно моделировать взаимодействие с пользователем; вместо этого пользователю нужно выполнить некоторую работу, и он наивно думает воспроизвести то, что сделал бы человек, в то время как есть гораздо более простые способы прямо из кода.   -  person Matteo Italia    schedule 12.01.2013
comment
Можно было бы еще проще использовать службу, которая предоставляет API для ..., исключив синтаксический анализ и извлечение   -  person Esailija    schedule 12.01.2013
comment
Смысл этого вопроса: мне нужно написать программу, которая делает это, или я хочу использовать это как предлог, чтобы узнать, как взаимодействовать с другими приложениями?   -  person abarnert    schedule 12.01.2013
comment
вы можете использовать один из сайтов, предоставляющих API для поиска текстов песен, например, LyricWiki API (I не пробовал).   -  person jfs    schedule 12.01.2013
comment
@MatteoItalia: я опубликовал реализацию вашего комментария на Python   -  person jfs    schedule 15.01.2013


Ответы (5)


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

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

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

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

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

Таким образом, вы можете сделать это с чем угодно, от селена для Chrome и автоматизации COM для Word до создания всех сообщений WM_ самостоятельно. Если это должно быть учебное упражнение, вопрос в том, что из этого вы хотите выучить сегодня.


Начнем с автоматизации COM. Используя pywin32, вы получаете прямой доступ к собственным интерфейсам сценариев приложения без необходимости брать на себя управление графическим интерфейсом пользователя, выясните, как для навигации по меню и диалоговым окнам и т. д. Это современная версия написания «макросов 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). И все известные мне руководства по использованию автоматизации COM из Python, например Quick Start to Client Side COM and Python, написаны для людей, которые уже знают об автоматизации COM и просто хотят знать, как это сделать с помощью Python. Тот факт, что Microsoft постоянно меняет названия всего, еще больше усложняет поиск - как вы догадались, что поиск в Google для автоматизации OLE, сценариев ActiveX, Windows Scripting House и т. Д. Будет иметь какое-то отношение к изучению автоматизации COM? Итак, я не уверен, что порекомендовать для начала. Я могу пообещать, что после того, как вы выучите всю эту ерунду, все будет так просто, как кажется из приведенного выше примера, но я не знаю, как преодолеть это первоначальное препятствие.

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

К счастью, существуют такие инструменты, как pywinauto, которые объединяют оба вида средств автоматизации графического интерфейса пользователя, чтобы сделать его намного проще. И есть такие инструменты, как swapy, которые могут помочь вам определить, какие команды вы хотите отправить. Если вы не связаны с Python, есть также такие инструменты, как AutoIt и _ 14_, которые даже проще, чем использовать 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 - он создает сценарии для веб-интерфейса пользователя так же, как pywinauto сценарии для графического интерфейса пользователя Windows.

person abarnert    schedule 11.01.2013
comment
Привет, Абарнерт! Большое спасибо. Хотя я не понимаю многого из того, что вы мне объяснили из-за моего незнания, теперь я думаю, что я понял основную идею о том, как заставить python работать с другими программами. В настоящее время я копаюсь в некоторых из ваших вышеупомянутых терминов, таких как GUI или DLL / SO / DYLIB Python, привязки COM. Я пробовал их в Google и в Википедии, однако представленные объяснения показались мне довольно академическими. Если можете, предоставьте мне несколько материалов для чтения по этим вопросам. Спасибо - person ttriet204; 12.01.2013
comment
Я отредактирую ответ, чтобы добавить немного дополнительной информации. Кроме того, теперь, когда я знаю, что вы работаете в Windows, я могу быть более конкретным. - person abarnert; 13.01.2013
comment
Еще раз спасибо, Абарнерт! Ты все время терпел меня! Я очень ценю то, что вы сделали, и пытаюсь разбить эту очень расплывчатую идею на простые для меня части! Я многому научился из ваших ответов. Вы делаете этот сайт действительно полезным и дружелюбным местом для таких новичков, как я. - person ttriet204; 14.01.2013

Следующий скрипт использует 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 в этой папке. Скопируйте приведенный выше код и вставьте его в Automa, щелкнув правой кнопкой мыши в окне консоли. Дважды нажмите Enter, чтобы избавиться от последнего ... в окне и вернуться к приглашению >>>. Закройте все остальные открытые окна и введите

>>> find_lyrics()

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

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

from automa.api import *

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

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

person Michael Herrmann    schedule 13.01.2013
comment
Привет, Майкл Херрманн. Большое спасибо. Я никогда не думал, что кто-то потратит время на написание всего кода для меня (я использую ваш код для изучения в качестве справки, так как я действительно действительно хочу применить то, что я узнал, для некоторого практического использования: D) Я уверен ваш код будет отличным примером для меня, а также для гильдии. Сейчас я скачиваю автома и не могу дождаться, чтобы опробовать вашу работу! Большое спасибо. Я уверен, что у меня появятся еще вопросы, которые я задам позже. - person ttriet204; 14.01.2013
comment
Во-первых, это скопирует и вставит весь текст результатов слов в файл Word, а не только текст. Это почти наверняка не то, что вам нужно. Многие сайты с текстами песен спроектированы так, чтобы не позволять вам копировать и вставлять тексты песен; даже если вам повезет, вы получите целый беспорядок с навигацией, ссылками и т. д., окружающими тексты песен. (Кроме того, когда это будет сделано, оба приложения будут закрыты, что, вероятно, тоже не то, что вам нужно, но это легче исправить.) - person abarnert; 15.01.2013
comment
Во-вторых, сообщение в блоге http://www.getautoma.com/blog/find-song-lyrics-with-automa об этом вопросе SO вводит в заблуждение. … Другие ответы состоят из… общего тона «это слишком сложно»? В самом деле, показать 5 строк win32com кода для создания нового файла в Word слишком сложно, но показать 7 строк кода Automa для того же самого - нет? Самая сложная часть - это извлечение текста песни, на который этот ответ просто наталкивает, фактически не решая его. - person abarnert; 15.01.2013
comment
Наконец, вам, вероятно, следует упомянуть, что Automa поставляется только в качестве пробной загрузки, и ни ограничения пробной версии, ни цена покупки нигде на сайте не доступны. - person abarnert; 15.01.2013
comment
Рад, что вам нравится ttriet :-) Если вы думаете, что это лучший ответ, было бы здорово, если бы вы могли принять его как таковой здесь! - person Michael Herrmann; 15.01.2013
comment
Абарнерт: Мое решение точно следует шагам, указанным в вопросе. С помощью этих шагов - используя Google для поиска и открытия любого сайта с текстами песен, который может появиться в результатах поиска - в общем случае невозможно скопировать только тексты песен. Мое решение иногда копирует нежелательный текст, однако добавление параметра filetype:txt немного снижает его. Например, для ввода The times they are a changin он возвращает точно требуемый результат. ... - person Michael Herrmann; 15.01.2013
comment
P.S .: О пробной версии @ ttriet204: Я поговорил со своими коллегами - мы думаем, что это круто, когда вы хотите узнать что-то новое, и мы будем рады дать вам бесплатную лицензию, если хотите :-) - person Michael Herrmann; 15.01.2013
comment
Привет, Майкл Германн. Я пробовал скачать Automa, но никак не могу. Я использовал IDM, чтобы загрузить его, и он всегда останавливался на 80%. Возможно, у моего компьютера проблемы с загрузкой файлов ... Это очень мило с вашей стороны (и ваших коллег), поскольку вы все предоставили мне бесплатную лицензию. Это, без сомнения, подвиг. Однако я не могу принять ваше предложение (хотя очень хочу: D), так как не хочу пользоваться вами и вашими коллегами. Спасибо. - person ttriet204; 15.01.2013
comment
Да, и вообще, ответ Абарнерта мне помог. Я написал, хотя и не понимаю многого из того, что вы сказали, это произошло из-за моего очень ограниченного программирования и общего понимания компьютера, а не из-за его ответа. И еще кое-что, как он ответил на мой вопрос, касался концепции взаимодействия Python с другими программами. - person ttriet204; 15.01.2013
comment
Мне жаль, потому что на сайте есть только один вариант - принять свой ответ в качестве так называемого официального ответа. Однако, пожалуйста, верьте, что все ответы на этой странице полезны для меня, и я хочу поблагодарить вас всех. Поскольку Абарнерт терпеливо относился ко мне с самого начала, и его ответы мне очень помогли, я выберу его в качестве принятого ответа. - person ttriet204; 15.01.2013

Вот реализация на 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'
person jfs    schedule 15.01.2013
comment
@ J.F. Себастьян. Я знаю, что этот пост / ответ старый, но я проверил ваш код, и он потерпел неудачу. Похоже, формат apI в lyrics.wikia.com/api.php изменен. Не могли бы вы указать мне правильное направление или ссылку, чтобы снова получить эту работу? Я смотрел и искал этот сайт api, и там есть контент / wiki api, но нигде не нашел api текстов. - person Michael SM; 21.03.2016
comment
@MichaelSM: конкретный API - это не вопрос ответа. Дело выражено в комментарии Matteo Italia, а код используется в качестве простой иллюстрации (чтобы прояснить требуемые усилия). Хотя код действительно работал на момент публикации. Если API-интерфейс lyrics.wikia.com больше не поддерживается; вы можете попробовать другой аналогичный сервис. - person jfs; 21.03.2016
comment
@ J.F. Себастьян: Спасибо за ответ. Меня особенно интересует API текстов песен. не могли бы вы порекомендовать хороший API для текстов песен? - person Michael SM; 23.03.2016

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

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

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

Получив результаты запроса страницы, проанализируйте его с помощью xml, beautifulsoup, lxlml и т. Д. И найдите раздел результата запроса, содержащий нужную вам информацию.

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

Цитата: Matteo Italia, g.d.d.c из комментариев к OP

person inspectorG4dget    schedule 11.01.2013
comment
doc - это бинарный формат, нет смысла открывать его в блокноте - person Esailija; 12.01.2013
comment
@Esailija: Я имел в виду, что вывод может быть сохранен как .txt файл вместо .doc файла - person inspectorG4dget; 12.01.2013
comment
Привет, InspectorG4dget! Большое спасибо за ответ. Это действительно помогло! Я попытался загрузить pywinauto и повеселился. Изначально я выбрал ваше первое предложение - Selenium. Однако я не могу загрузить файл по предоставленной вами ссылке, возможно, что-то не так с моим компьютером или моим подключением к Интернету. Я все время пытался загрузить файл, но не мог его получить. Затем я поискал его в Интернете, но я просто не могу найти ссылку (или ту, которая работает!). Пожалуйста, дайте мне еще одну ссылку на Selenium, если сможете. Я очень ценю вашу помощь - person ttriet204; 12.01.2013
comment
seleniumhq.org - это домашняя страница Selenium. Инструкции должны объяснять, как получить различные части Selenium WebDriver, которые вам нужны (и какие это части). - person abarnert; 13.01.2013

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

person Cameron Sparr    schedule 11.01.2013
comment
Спасибо! Я все еще ищу Selenium для загрузки. Можете дать ссылку? - person ttriet204; 12.01.2013