Comment lire le texte du presse-papiers (Windows) à partir de python?

95

Comment lire le texte du presse-papiers (Windows) à partir de python?

Foo42
la source
3
Lié à cette question .
glglgl
dans mon cas, seule la réponse dan a fonctionné, qui utilise le package presse-papiers .
Soorena

Réponses:

104

Vous pouvez utiliser le module appelé win32clipboard , qui fait partie de pywin32 .

Voici un exemple qui définit d'abord les données du presse-papiers puis les obtient:

import win32clipboard

# set clipboard data
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
win32clipboard.SetClipboardText('testing 123')
win32clipboard.CloseClipboard()

# get clipboard data
win32clipboard.OpenClipboard()
data = win32clipboard.GetClipboardData()
win32clipboard.CloseClipboard()
print data

Un rappel important de la documentation:

Lorsque la fenêtre a fini d'examiner ou de modifier le presse-papiers, fermez le presse-papiers en appelant CloseClipboard. Cela permet à d'autres fenêtres d'accéder au presse-papiers. Ne placez pas d'objet dans le presse-papiers après avoir appelé CloseClipboard.

Sakin
la source
6
Savez-vous s'il existe un moyen d'utiliser l'instruction «with»?
Norfeldt du
3
À noter, dans py34, win7, SetClipboardText ne fonctionnait pas sans un appel préalable à EmptyClipboard
CoderTao
Ce module est utile si vous souhaitez effectuer des opérations plus complexes, par exemple extraire le contenu au format HTML du presse-papiers. Voir stackoverflow.com/questions/17298897/…
xji
2
@Norfeldt S'il n'y a pas de méthode native, vous pouvez facilement créer votre propre objet personnalisé qui prend en charge "avec"
Elijas
39

vous pouvez facilement le faire via le module intégré Tkinter qui est essentiellement une bibliothèque GUI. Ce code crée un widget vide pour obtenir le contenu du presse-papiers du système d'exploitation.

#from tkinter import Tk  # Python 3
from Tkinter import Tk
Tk().clipboard_get()
kmonsoor
la source
2
Veuillez ajouter un commentaire à ce code et (éventuellement) des liens vers la documentation pertinente.
jb.
6
devrait être tkinterau lieu de Tkinter. Sinon, cela ne fonctionnait pas sur mon python 3.7.3 64bit win10.
jerik
21

J'ai vu de nombreuses suggestions pour utiliser le module win32, mais Tkinter fournit la méthode la plus courte et la plus simple que j'ai vue, comme dans cet article: Comment copier une chaîne dans le presse-papiers sous Windows en utilisant Python?

De plus, Tkinter est dans la bibliothèque standard de python.

Boutons840
la source
3
Un peu de code qui obtiendra la valeur du presse-papiers via Tkinter: de Tkinter import Tk [\ nl] r = Tk () [\ nl] result = r.selection_get (selection = "CLIPBOARD") [\ nl] r.destroy ()
mgkrebbs
18

Si vous ne souhaitez pas installer de packages supplémentaires, vous ctypespouvez également faire le travail.

import ctypes

CF_TEXT = 1

kernel32 = ctypes.windll.kernel32
kernel32.GlobalLock.argtypes = [ctypes.c_void_p]
kernel32.GlobalLock.restype = ctypes.c_void_p
kernel32.GlobalUnlock.argtypes = [ctypes.c_void_p]
user32 = ctypes.windll.user32
user32.GetClipboardData.restype = ctypes.c_void_p

def get_clipboard_text():
    user32.OpenClipboard(0)
    try:
        if user32.IsClipboardFormatAvailable(CF_TEXT):
            data = user32.GetClipboardData(CF_TEXT)
            data_locked = kernel32.GlobalLock(data)
            text = ctypes.c_char_p(data_locked)
            value = text.value
            kernel32.GlobalUnlock(data_locked)
            return value
    finally:
        user32.CloseClipboard()

print(get_clipboard_text())
kichik
la source
Cela ne semble pas fonctionner sous Windows 10. Il imprime toujours "Aucun".
Aran-Fey
Windows 10 fonctionnait bien pour moi tant que j'utilisais Python 32 bits. J'ai mis à jour la réponse pour travailler également avec 64 bits.
kichik
aller cette erreur "pointeur char attendu, obtenu int" sur la ligne "text = ctypes.c_char_p (data_locked)", une idée?
txemsukr
Ce serait formidable de voir une solution similaire pour copier du texte dans le presse-papiers également.
mrkbutty
14

J'ai découvert que c'était le moyen le plus simple d'accéder au presse-papiers à partir de python:

1) Installez pyperclip: pip install pyperclip

2) utilisation:

import pyperclip

s = pyperclip.paste()
pyperclip.copy(s)

# the type of s is string

Testé sur Win10 64 bits, Python 3.5 et Python 3.7.3 (64 bits). Semble également fonctionner avec des caractères non ASCII. Les caractères testés incluent ± ° © © αβγθΔΨΦåäö

np8
la source
convient-il pour 3,6? il est installé avec succès mais lorsqu'il est utilisé avec la méthode paste (), il me donne une erreur: "à partir de la version d' importation PySide comme PYSIDE_VERSION # analyse: ignore ModuleNotFoundError: Aucun module nommé 'PySide'". Quand j'ai essayé d'installer Pyside, il dit qu'il n'est pas pris en charge dans la version 3.6
Gaurav
Oui, cela devrait fonctionner sur Python 3.6, et je viens de tester avec Python 3.7.4 (64 bits). En regardant le setup.py du package, il ne devrait avoir aucune dépendance à Pyside ou à tout autre package. Êtes-vous sûr que la commande coller essaie d'utiliser Pyside?
np8
Oui, la commande coller recherche Pyside et comme Pyside ne prend en charge que jusqu'à python 3.4, elle donne une erreur
gaurav
Cela semble être la solution la plus simple pour WSL avec python3.6
énoncé
11

La réponse la plus votée ci-dessus est étrange dans la mesure où elle efface simplement le presse-papiers puis obtient le contenu (qui est alors vide). On pourrait effacer le presse-papiers pour être sûr que certains types de contenu de presse-papiers comme «texte formaté» ne «couvrent» pas le contenu de texte brut que vous souhaitez enregistrer dans le presse-papiers.

Le morceau de code suivant remplace toutes les nouvelles lignes dans le presse-papiers par des espaces, puis supprime tous les espaces doubles et enregistre enfin le contenu dans le presse-papiers:

import win32clipboard

win32clipboard.OpenClipboard()
c = win32clipboard.GetClipboardData()
win32clipboard.EmptyClipboard()
c = c.replace('\n', ' ')
c = c.replace('\r', ' ')
while c.find('  ') != -1:
    c = c.replace('  ', ' ')
win32clipboard.SetClipboardText(c)
win32clipboard.CloseClipboard()
née
la source
7

La bibliothèque standard python le fait ...

try:
    # Python3
    import tkinter as tk
except ImportError:
    # Python2
    import Tkinter as tk

def getClipboardText():
    root = tk.Tk()
    # keep the window from showing
    root.withdraw()
    return root.clipboard_get()
Paul Sumpner
la source
3

Pour mon programme de console, les réponses avec tkinter ci-dessus ne fonctionnaient pas tout à fait pour moi car le .destroy () donnait toujours une erreur ,:

impossible d'appeler la commande "event": l'application a été détruite lors de l'exécution ...

ou lors de l'utilisation de .withdraw (), la fenêtre de la console n'a pas récupéré le focus.

Pour résoudre ce problème, vous devez également appeler .update () avant le .destroy (). Exemple:

# Python 3
import tkinter

r = tkinter.Tk()
text = r.clipboard_get()
r.withdraw()
r.update()
r.destroy()

Le r.withdraw () empêche le cadre de s'afficher pendant un milliseconde, puis il sera détruit en renvoyant le focus à la console.

user136036
la source
2

Utiliser le presse-papiers de la bibliothèque Pythons

Il est simplement utilisé comme ceci:

import clipboard
clipboard.copy("this text is now in the clipboard")
print clipboard.paste()  
Dan
la source
8
Ceci utilise essentiellement pyperclip. Le code source complet de ce module est littéralement: from pyperclip import copy, paste.
pbreach
1

Une astuce pas très directe:

Utilisez la touche de raccourci pyautogui:

Import pyautogui
pyautogui.hotkey('ctrl', 'v')

Par conséquent, vous pouvez coller les données du presse-papiers à votre guise.

voir2
la source