web-dev-qa-db-fra.com

Interagissez avec d'autres programmes en utilisant Python

J'ai l'idée d'écrire un programme en utilisant Python qui trouvera les paroles d'une chanson dont j'ai donné le nom. Je pense que l'ensemble du processus devrait se résumer à quelques éléments ci-dessous. Voici ce que je veux que le programme fasse lorsque je l'exécute:

  • Me demander d'entrer le nom d'une chanson
  • copier ce nom
  • ouvrir un navigateur web (google chrome par exemple)
  • collez ce nom dans la barre d'adresse et recherchez des informations sur la chanson
  • ouvrir une page contenant les paroles
  • copier les paroles
  • exécuter un éditeur de texte (comme Microsoft Word par exemple)
  • coller les paroles
  • enregistrez le nouveau fichier texte avec le nom de la chanson

Je ne demande pas de code, bien sûr. Je veux juste connaître les concepts ou les idées sur la façon d'utiliser python pour interagir avec d'autres programmes

Pour être plus précis, je pense que je veux savoir, par exemple, comment nous indiquons où se trouve la barre d'adresse dans Google Chrome et disons à python de coller le nom là-bas. Ou comment nous expliquons à python comment copier les paroles ainsi que les coller dans la feuille de Microsof Word, puis les enregistrer.

J'ai lu (je lis toujours) plusieurs livres sur Python: Byte of python, Learn python hard way, Python for dummies, Beginning Game Development with Python et Pygame. Cependant, j'ai découvert qu'il semble que j'apprenne seulement (ou presque uniquement) à créer des programmes qui fonctionnent sur lui-même (je ne peux pas dire à mon programme de faire les choses que je veux avec d'autres programmes déjà installés sur mon ordinateur)

Je sais que ma question semble plutôt idiote, mais je veux vraiment savoir comment cela fonctionne, la façon dont nous disons à Python de confirmer que cette partie du navigateur Google chrome est l'adresse et qu'il doit y coller le nom de la chanson. L'idée de faire interagir python avec un autre programme est vraiment très vague pour moi et je veux vraiment comprendre cela.

Merci à tous ceux qui passent leur temps à lire ma si longue question.

ttriet204

21
ttriet204

Si ce que vous cherchez vraiment est une bonne excuse pour vous apprendre à interagir avec d'autres applications, ce n'est peut-être pas la meilleure. Les navigateurs Web sont désordonnés, le timing va être imprévisible, etc. Donc, vous avez assumé une tâche très difficile - et qui serait très facile si vous le faisiez de la manière habituelle (parlez directement au serveur, créez le fichier texte directement, etc., le tout sans toucher à aucun autre programme).

Mais si vous souhaitez interagir avec d'autres applications, il existe une variété d'approches différentes, et celle qui convient dépend du type d'applications dont vous avez besoin.

  • Certaines applications sont conçues pour être automatisées de l'extérieur. Sous Windows, cela signifie presque toujours une interface COM, généralement avec une interface IDispatch, pour laquelle vous pouvez utiliser les wrappers COM de pywin32; sur Mac, cela signifie une interface AppleEvent, pour laquelle vous utilisez ScriptingBridge ou appscript; sur d'autres plateformes, il n'y a pas de norme universelle. IE (mais probablement pas Chrome) et Word ont tous deux de telles interfaces.

  • Certaines applications ont une interface non graphique, que ce soit une ligne de commande que vous pouvez piloter avec popen ou une DLL/SO/DYLIB que vous pouvez charger via ctypes. Ou, idéalement, quelqu'un d'autre a déjà écrit des liaisons Python pour vous.

  • Certaines applications n'ont rien d'autre que l'interface graphique, et il n'y a aucun moyen de faire l'automatisation de l'interface graphique. Vous pouvez le faire à un niveau bas, en créant des messages WM_ à envoyer via pywin32 Sous Windows, en utilisant les API d'accessibilité sur Mac, etc., ou à un niveau un peu plus élevé avec des bibliothèques comme pywinauto , ou éventuellement au niveau très élevé de Selenium ou d'outils similaires conçus pour automatiser des applications spécifiques.

Donc, vous pouvez le faire avec n'importe quoi de Selenium pour Chrome et l'automatisation COM pour Word, pour créer vous-même tous les messages WM_. Si cela est censé être un exercice d'apprentissage, la question est de savoir laquelle des ces choses que vous voulez apprendre aujourd'hui.


Commençons par l'automatisation COM. En utilisant pywin32 , vous accédez directement aux propres interfaces de script de l'application, sans avoir à prendre le contrôle de l'interface graphique de l'utilisateur, à comprendre comment naviguer dans les menus et les boîtes de dialogue, etc. la version moderne de l'écriture de "macros Word" - les macros peuvent être des scripts externes au lieu de l'intérieur de Word, et elles n'ont pas besoin d'être écrites en VB, mais elles sont assez similaires. La dernière partie de votre script ressemblerait à ceci:

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

Si vous regardez Microsoft Word Scripts , vous pouvez voir un tas d'exemples. Cependant, vous remarquerez peut-être qu'ils sont écrits en VBScript. Et si vous recherchez des tutoriels, ils sont tous écrits pour VBScript (ou VB plus ancien). Et la documentation de la plupart des applications est écrite pour VBScript (ou VB, .NET ou même COM de bas niveau). Et tous les didacticiels que je connais pour utiliser l'automatisation COM à partir de Python, comme Démarrage rapide vers COM côté client et Python , sont écrits pour les personnes qui connaissent déjà l'automatisation COM et veulent juste savoir comment faites-le depuis Python. Le fait que Microsoft ne cesse de changer le nom de tout rend la recherche encore plus difficile - comment pensez-vous que googler pour OLE automation, script ActiveX, Windows Scripting House, etc. aurait quelque chose à faire avec l'automatisation COM? Donc, je ne sais pas quoi recommander pour commencer. Je peux vous promettre que tout est aussi simple que cela dans l'exemple ci-dessus, une fois que vous avez appris toutes les absurdités, mais je ne le fais pas savoir comment surmonter cet obstacle initial.

Quoi qu'il en soit, toutes les applications ne sont pas automatisables. Et parfois, même si c'est le cas, décrire les actions de l'interface graphique (ce qu'un utilisateur clique sur l'écran) est plus simple que de penser en termes de modèle d'objet de l'application. "Sélectionnez le troisième paragraphe" est difficile à décrire en termes d'interface graphique, mais "sélectionnez tout le document" est facile - appuyez simplement sur contrôle-A, ou allez dans le menu Edition et sélectionnez tout. L'automatisation GUI est beaucoup plus difficile que l'automatisation COM, car vous devez soit envoyer à l'application les mêmes messages que Windows lui-même envoie pour représenter vos actions utilisateur (par exemple, voir " Notifications de men ") ou, pire, créer des messages de la souris comme "aller (32, 4) pixels dans le coin supérieur gauche, cliquer, faire descendre la souris de 16 pixels, cliquer à nouveau" pour dire "ouvrir le menu Fichier, puis cliquer sur Nouveau".

Heureusement, il existe des outils comme pywinauto qui regroupent les deux types d'automatisation GUI pour le rendre beaucoup plus simple. Et il existe des outils comme swapy qui peuvent vous aider à déterminer quelles commandes vous souhaitez envoyer. Si vous n'êtes pas connecté à Python, il existe également des outils comme AutoIt et Actions qui sont encore plus faciles que d'utiliser swapy et pywinauto, du moins au début. De cette façon, la dernière partie de votre script pourrait ressembler à ceci:

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

Enfin, même avec tous ces outils, les navigateurs Web sont très difficiles à automatiser, car chaque page Web a ses propres menus, boutons, etc. qui ne sont pas des contrôles Windows, mais du HTML. À moins que vous ne vouliez descendre jusqu'au niveau de "déplacer la souris de 12 pixels", il est très difficile de les gérer. C'est là que Selenium entre en jeu: il écrit les interfaces graphiques Web de la même manière que pywinauto écrit les interfaces graphiques Windows.

29
abarnert

Le script suivant utilise Automa pour faire exactement ce que vous voulez (testé sur 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)

Pour l'essayer par vous-même, téléchargez Automa.Zip depuis son page de téléchargement et décompressez-le, par exemple, c:\Program Files. Vous obtiendrez un dossier appelé Automa 1.1.2. Courir Automa.exe dans ce dossier. Copiez le code ci-dessus et collez-le dans Automa en cliquant avec le bouton droit dans la fenêtre de la console. Appuyez deux fois sur Entrée pour supprimer le dernier ... dans la fenêtre et revenez à l'invite >>>. Fermez toutes les autres fenêtres ouvertes et saisissez

>>> find_lyrics()

Cela effectue les étapes requises.

Automa est une Python : pour l'utiliser en tant que telle, vous devez ajouter la ligne

from automa.api import *

en haut de vos scripts et du fichier library.Zip du répertoire d'installation d'Automa à votre variable d'environnement PYTHONPATH.

Si vous avez d'autres questions, faites-le moi savoir :-)

15
Michael Herrmann

Voici une implémentation en Python of @ Commentaire de Matteo Italia :

Vous abordez le problème dans une "perspective utilisateur" alors que vous devez l'aborder dans une "perspective programmeur"; vous n'avez pas besoin d'ouvrir un navigateur, de copier le texte, d'ouvrir Word ou autre, vous devez effectuer les requêtes HTTP appropriées, analyser le code HTML approprié, extraire le texte et l'écrire dans un fichier à l'intérieur de votre Python. Tous les outils pour ce faire sont disponibles dans Python (en particulier, vous aurez besoin de urllib2 et 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')

Exemple

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

Production

 J'ai payé ma cotisation 
 À maintes reprises 
 J'ai fait ma peine 
 Mais je n'ai commis aucun crime 
 
 Et mauvaises erreurs 
 J'ai fait quelques 
 J'ai eu ma part de sable frappé [...] 
 écrit '[Queen] [We are the Champions] paroles. SMS'
11
jfs

Si vous voulez vraiment ouvrir un navigateur, etc., regardez Selenium . Mais c'est exagéré pour vos besoins. Le sélénium est utilisé pour simuler les clics sur les boutons, etc. pour tester l'apparence des sites Web sur divers navigateurs, etc. Mechanize est moins exagéré pour cela

Ce que vous voulez vraiment faire, c'est comprendre comment un navigateur (ou tout autre programme) fonctionne sous le capot, c'est-à-dire lorsque vous cliquez sur la souris ou tapez sur le clavier ou appuyez sur Save, que fait le programme dans les coulisses ? C'est ce travail en arrière-plan que vous voulez que votre code python fasse.

Donc, utilisez urllib, urllib2 ou requests (ou diable, même scrapy ) pour demander une page Web (découvrez comment assembler l'url d'un recherche google ou la requête php GET d'un site de paroles). Google dispose également d'une API de recherche dont vous pouvez profiter pour effectuer une recherche google.

Une fois que vous avez obtenu les résultats de votre demande de page, analysez-les avec xml, beautifulsoup, lxlml, etc. et trouvez la section du résultat de la demande qui contient les informations que vous après.

Maintenant que vous avez vos paroles, la chose la plus simple à faire est d'ouvrir un fichier texte et de vider les paroles dedans et d'écrire sur le disque. Mais si vous voulez vraiment le faire avec MS Word, ouvrez un fichier doc dans le bloc-notes ou notepad ++ et regardez sa structure. Maintenant, utilisez python pour construire un document avec une structure similaire, dans lequel le contenu sera les paroles téléchargées.
Si cette méthode échoue, vous pouvez examiner pywinauto ou similaire pour automatiser le collage de texte dans un document MS Word et cliquer sur Save

Citation: Matteo Italia, g.d.d.c des commentaires sur le PO

5
inspectorG4dget

Vous devriez regarder dans un paquet appelé Selenium pour interagir avec les navigateurs Web

0
Cameron Sparr