Interakcja z innymi programami używającymi Pythona

Mam pomysł na napisanie programu w Pythonie, który znajdzie tekst piosenki, której nazwę podałem. Myślę, że cały proces powinien sprowadzać się do kilku rzeczy poniżej. Oto, co chcę, aby program robił, gdy go uruchamiam:

  • poproś mnie o podanie nazwy utworu
  • copy that name
  • Otwórz przeglądarkę internetową (na przykład Google chrome)
  • Wklej tę nazwę w pasku adresu i znajdź informacje o utworze
  • Otwórz stronę zawierającą teksty
  • copy that lyrics
  • Uruchom edytor tekstu (jak na przykład Microsoft Word)
  • Wklej tekst
  • zapisz nowy plik tekstowy z nazwą utworu

Nie proszę o kod, oczywiście. Chcę tylko wiedzieć, jak używać Pythona do interakcji z innymi programami

Mówiąc dokładniej, myślę, że chcę wiedzieć, na przykład fox, jak wskażemy, gdzie jest pasek adresu w Google Chrome i powiemy pythonowi, aby wkleił to nazwisko. Albo jak powiemy pythonowi, jak skopiować tekst, a także wkleić go do arkusza Microsofu Worda, a następnie zapisać go.

Czytałem (nadal czytam) kilka książek na temat Pythona: Bajt Pythona, Nauka Pythona na twardo, Python dla manekinów, rozpoczęcie tworzenia gier z Pythonem i Pygame. Jednak odkryłem, że wydaje się, że tylko (lub prawie tylko) uczę się tworzyć programy, które działają na siebie (nie mogę powiedzieć mojemu programowi, aby robił rzeczy, które chcę z innymi programami, które są już zainstalowany na moim komputerze)

Wiem, że moje pytanie brzmi trochę głupio, ale naprawdę chcę wiedzieć, jak to działa, sposób, w jaki mówimy Pythonowi, aby regconizował, że ta część przeglądarki Google chrome jest paskiem adresu i że powinien wkleić nazwę utworu w nim. Cały pomysł na interakcję Pythona z innym programem jest dla mnie bardzo niejasny i po prostu bardzo chcę to pojąć.

Dziękuję wszystkim, którzy spędzają czas czytając moje tak długo pytanie.

Ttriet204

Author: jfs, 2013-01-12

5 answers

Jeśli to, na co naprawdę patrzysz, jest dobrą wymówką, aby nauczyć się interakcji z innymi aplikacjami, to może nie być najlepsza. Przeglądarki internetowe są niechlujne, czas będzie nieprzewidywalny itp. Tak więc, podjąłeś się bardzo trudnego zadania-i takie, które byłoby bardzo łatwe, jeśli zrobisz to w zwykły sposób (porozmawiaj bezpośrednio z serwerem, Utwórz plik tekstowy bezpośrednio, itp., wszystko bez dotykania innych programów).

Ale jeśli chcesz wchodzić w interakcje z innymi aplikacjami, istnieją różne różnych podejść, a to, co jest odpowiednie, zależy od rodzajów aplikacji, z którymi musisz sobie poradzić.

  • Niektóre aplikacje są zaprojektowane do automatyzacji z zewnątrz. W systemie Windows oznacza to prawie zawsze interfejs COM, zwykle z interfejsem IDispatch, dla którego można używać owijarek COM pywin32; Na Mac oznacza interfejs AppleEvent, dla którego używa się ScriptingBridge lub appscript; na innych platformach nie ma uniwersalnego standardu. IE (ale chyba Nie Chrome) i Word zarówno mieć takie interfejsy.

  • Niektóre aplikacje mają interfejs nie-GUI-niezależnie od tego, czy jest to linia poleceń, którą można sterować za pomocą popen, czy DLL/SO/DYLIB, który można załadować przez ctypes. Albo, najlepiej, ktoś inny już napisał dla Ciebie wiązania Pythona.

  • Niektóre aplikacje mają tylko GUI i nie ma możliwości obejścia automatyzacji GUI. Możesz to zrobić na niskim poziomie, tworząc wiadomości WM_ wysyłane przez pywin32 w systemie Windows, używając interfejsów API dostępności na Macu itp., lub na nieco wyższym poziomie z bibliotekami takimi jak pywinauto, lub prawdopodobnie na bardzo wysokim poziomie selenium lub podobnymi narzędziami zbudowanymi do automatyzacji określonych aplikacji.

Więc możesz to zrobić za pomocą wszystkiego, od selenium dla Chrome i COM automation dla Word, po tworzenie wszystkich wiadomości WM_ samodzielnie. Jeśli ma to być ćwiczenie uczenia się, pytanie brzmi, które z tych rzeczy chcesz się nauczyć dzisiaj.


Zacznijmy od automatyzacji COM. Za pomocą pywin32, ty bezpośredni dostęp do własnych interfejsów skryptowych aplikacji, bez konieczności przejmowania kontroli nad GUI od użytkownika, dowiedzieć się, jak poruszać się po menu i oknach dialogowych itp. Jest to nowoczesna wersja pisania "makr Worda" -makra mogą być zewnętrznymi skryptami zamiast wewnątrz Worda i nie muszą być napisane w VB, ale wyglądają bardzo podobnie. Ostatnia część twojego skryptu wyglądałaby mniej więcej tak:

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

Jeśli spojrzysz na Skrypty Microsoft Word , możesz zobaczyć kilka przykładów. Możesz jednak zauważyć, że są one napisane w języku VBScript. A jeśli rozejrzysz się za samouczkami, wszystkie są napisane dla VBScript (lub starszego VB). A dokumentacja dla większości aplikacji jest napisana dla VBScript (lub VB,. NET, a nawet low-level COM). I wszystkie samouczki, które znam do korzystania z automatyzacji COM z Pythona, takie jak Quick Start to Client Side COM i Python , są napisane dla osób, które już wiedzą o automatyzacji COM i chcą wiedzieć, jak to zrobić z Python. Fakt, że Microsoft ciągle zmienia nazwę wszystkiego sprawia, że jeszcze trudniej go szukać-jak można się domyślić, że googling dla OLE automation, ActiveX scripting, Windows Scripting House itp. czy ma to coś wspólnego z nauką o automatyzacji kom? Więc nie jestem pewien, co polecić na początek. Mogę obiecać, że to wszystko jest tak proste, jak wygląda z tego przykładu powyżej, Kiedy nauczysz się wszystkich bzdur, ale nie wiem, jak przejść przez tę początkową przeszkodę.

W każdym razie, nie każda aplikacja jest automatyczna. A czasami, nawet jeśli tak jest, opisywanie działań GUI (co użytkownik kliknie na ekranie) jest prostsze niż myślenie w kategoriach modelu obiektowego aplikacji. "Wybierz trzeci akapit" jest trudne do opisania w kategoriach GUI, ale "wybierz cały dokument"jest łatwe-wystarczy nacisnąć control-A, lub przejdź do menu Edycja i wybierz wszystko. Automatyzacja GUI jest znacznie trudniejsza niż automatyzacja COM, ponieważ musisz albo wysłać aplikacji te same wiadomości, które Sam system Windows wysyła, aby reprezentować działania użytkownika (np. zobacz "powiadomienia menu") lub, co gorsza, wytwarzaj komunikaty myszy, takie jak "idź (32, 4) pikseli z lewego górnego rogu, kliknij, mysz w dół 16 pikseli, kliknij ponownie", aby powiedzieć "otwórz menu Plik, a następnie kliknij Nowy".

[[19]}na szczęście istnieją takie narzędzia jak pywinauto to owija oba rodzaje automatyzacji GUI, aby było o wiele prostsze. I są narzędzia takie jak swapy które pomogą Ci zorientować się, jakie polecenia chcę wysłać. Jeśli nie jesteś przywiązany do Pythona, istnieją również narzędzia takie jak AutoIt oraz Actions to nawet łatwiejsze niż używanie swapy i pywinauto, przynajmniej na początku. W ten sposób ostatnia część skryptu może wyglądać następująco:
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()

Wreszcie, nawet z tymi wszystkimi narzędziami, przeglądarki internetowe są bardzo trudne do zautomatyzowania, ponieważ każda strona ma swoje własne menu, przyciski itp. to nie są kontrolki Windows, ale HTML. Chyba, że chcesz zejść na dół. do poziomu "przesuń mysz 12 pikseli", bardzo trudno sobie z nimi poradzić. To miejsce, gdzie selenium wchodzi-to Skrypty GUI web w taki sam sposób, jak pywinauto Skrypty GUI Windows.

 22
Author: abarnert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-12 21:16:16

Poniższy skrypt używa Automa , aby zrobić dokładnie to ,co chcesz (testowane na 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)

Aby samemu wypróbować, Pobierz Automa.zip ze strony pobierania i rozpakuj do, powiedzmy, c:\Program Files. Otrzymasz folder o nazwie Automa 1.1.2. Uruchom Automa.exe w tym folderze. Skopiuj powyższy kod i wklej go do Automa klikając prawym przyciskiem myszy w oknie konsoli. Naciśnij Enter dwukrotnie, aby pozbyć się ostatniego ... w oknie i wrócić na znak zachęty >>>. Zamknij wszystkie inne otwórz okna i wpisz

>>> find_lyrics()

Wykonuje wymagane kroki.

Automa jest biblioteką Pythona: aby użyć jej jako takiej, musisz dodać linię

from automa.api import *

Do góry skryptów i pliku library.zip z katalogu instalacyjnego Automa do zmiennej środowiskowej PYTHONPATH.

Jeśli masz jeszcze jakieś pytania, daj mi znać: -)

 13
Author: Michael Herrmann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-05 11:56:13

Oto implementacja w Pythonie @ Matteo Italia ' s comment :

Podchodzisz do problemu z "perspektywy użytkownika", gdy należy podchodzić do niego z "punktu widzenia programisty"; nie trzeba otwórz przeglądarkę, skopiuj tekst, otwórz słowo lub cokolwiek, musisz wykonaj odpowiednie żądania HTTP, przeanalizuj odpowiedni HTML, wyodrębnij tekst i zapisz go do pliku z wnętrza Pythona scenariusz. Wszystkie narzędzia do tego są dostępne w Pythonie (w szczególnie będziesz potrzebował urllib2 i 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')

Przykład

$ printf "Queen\nWe are the Champions" | python get-lyrics.py 

Wyjście

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'
 10
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:47

Jeśli naprawdę chcesz otworzyć przeglądarkę, itp, spójrz na selenium. Ale to przesada dla Twoich celów. Selenium służy do symulacji kliknięć przycisków itp. do testowania wyglądu stron internetowych w różnych przeglądarkach itp. mechanizacja jest mniej przesadą dla tego

To, co naprawdę chcesz zrobić, to zrozumieć, jak przeglądarka (lub jakikolwiek inny program) działa pod maską, tj. po kliknięciu myszki lub wpisaniu na klawiaturze lub naciśnięciu Save, co robi program za kulisami? To jest ta praca za kulisami, którą chcesz, aby Twój kod Pythona wykonał.

Więc użyj urllib, urllib2 lub requests (albo nawet heck scrapy) aby zażądać strony internetowej (dowiedz się, jak połączyć url do wyszukiwarki google lub PHP GET żądanie strony lyrics). Google ma również API wyszukiwania , które można wykorzystać do przeprowadzenia wyszukiwania google.

Po uzyskaniu wyników z żądania strony, przeanalizuj je za pomocą xml, beautifulsoup, lxlml, itd. i znajdź sekcję wyniku żądania, która zawiera informacje, których szukasz.

Teraz, gdy masz swoje teksty, najprostszą rzeczą do zrobienia jest otwarcie pliku tekstowego, wrzucenie tekstu do niego i zapisanie go na dysk. Ale jeśli naprawdę chcesz to zrobić z MS Word, otwórz plik doc w notepad lub notepad++ i spójrz na jego strukturę. Teraz użyj Pythona, aby zbudować dokument o podobnej strukturze, w którym zawartość będzie pobrane teksty.
Jeśli ta metoda zawiedzie, możesz zajrzyj do pywinauto lub takiego, aby zautomatyzować wklejanie tekstu do dokumentu MS Word i kliknięcie na Save

Cytat: Matteo Italia, g.d.D. C Z komentarzy do po

 4
Author: inspectorG4dget,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-11 23:28:58

Powinieneś zajrzeć do pakietu o nazwie selenium do interakcji z przeglądarkami internetowymi

 0
Author: Cameron Sparr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-11 23:16:20