Взаимодействие с другими программами с использованием Python - программирование
Подтвердить что ты не робот

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

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

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

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

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

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

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

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

ttriet204

4b9b3361

Ответ 1

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

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

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

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

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

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


Начнем с автоматизации COM. Используя pywin32, вы напрямую обращаетесь к собственным скриптовым интерфейсам приложения, не требуя управления GUI от пользователя, выясните, как перемещаться по меню и диалоговым окнам, и т.д. Это современная версия написания "макросов Word" - макросы могут быть внешними скриптами, а не внутри Word, и их не нужно записывать в VB, но они выглядят довольно похожими. Последняя часть вашего script будет выглядеть примерно так:

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

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

К счастью, есть такие инструменты, как pywinauto, которые завершают работу обоих типов средств автоматизации графического интерфейса, чтобы сделать его намного проще. И есть такие инструменты, как swapyчто может помочь вам понять, какие команды вы хотите отправить. Если вы не привязаны к Python, есть также такие инструменты, как AutoIt и Actions, что даже проще, чем использовать swapy и pywinauto, по крайней мере, когда вы начинаете. Таким образом, последняя часть вашего script может выглядеть так:

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 GUI.

Ответ 2

Следующий script использует 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 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.

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

Ответ 3

Здесь реализована реализация в Python комментария @Matteo Italia:

Вы приближаетесь к проблеме с точки зрения пользователя, когда вы должен подходить к нему с "перспективы программиста"; вам не нужно открыть браузер, скопировать текст, открыть Word или что-то еще, вам нужно выполнять соответствующие HTTP-запросы, анализировать соответствующий HTML, извлеките текст и напишите его в файл из своего Python script. Все инструменты для этого доступны в 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'

Ответ 4

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

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

Итак, используйте urllib, urllib2 или requests (или heck, даже scrapy), чтобы запросить веб-страницу (узнайте, как собрать 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

Ответ 5

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