¿Cómo puede Python acceder al portapapeles X11?

Quiero que mi script de Python pueda copiar y pegar en / desde el portapapeles a través de x11 (para que funcione en Linux). ¿Alguien puede indicarme los recursos específicos que puedo ver o los conceptos que tendría que dominar?

¿Es posible hacer esto con la biblioteca de Python X en http://python-xlib.sourceforge.net ?

Yo prefiero una solución basada en Tkinter sobre una que requiere Pygtk, simplemente por el potencial que este último tiene para los desafíos de instalación. Dado esto, mi recomendación para Alvin Smith es leer:

  • Acceso al Portapapeles Tkinter
  • Cortar y pegar texto entre widgets Tkinter

Solución basada en Tkinter mencionada en la respuesta de Cameron Laird :

import Tkinter root = Tkinter.Tk() print(root.selection_get(selection="CLIPBOARD")) 

Reemplace “CLIPBOARD” con “PRIMARIO” para obtener la selección PRIMARY lugar.

También vea esta respuesta .

Solución python-xlib , basada en PrintSelection () y python-xlib / examples / get_selection.py

 from Xlib import X, display as Xdisplay def property2str(display, prop): if prop.property_type == display.get_atom("STRING"): return prop.value.decode('ISO-8859-1') elif prop.property_type == display.get_atom("UTF8_STRING"): return prop.value.decode('UTF-8') else: return "".join(str(c) for c in prop.value) def get_selection(display, window, bufname, typename): bufid = display.get_atom(bufname) typeid = display.get_atom(typename) propid = display.get_atom('XSEL_DATA') incrid = display.get_atom('INCR') window.change_attributes(event_mask = X.PropertyChangeMask) window.convert_selection(bufid, typeid, propid, X.CurrentTime) while True: ev = display.next_event() if ev.type == X.SelectionNotify and ev.selection == bufid: break if ev.property == X.NONE: return None # request failed, eg owner can't convert to target format type else: prop = window.get_property(propid, X.AnyPropertyType, 0, 2**31-1, 1) if prop.property_type == incrid: result = "" while True: while True: ev = display.next_event() if ev.type == X.PropertyNotify and ev.atom == propid and ev.state == X.PropertyNewValue: break prop = window.get_property(propid, X.AnyPropertyType, 0, 2**31-1, 1) if len(prop.value) == 0: break result += property2str(display, prop) return result else: return property2str(display, prop) display = Xdisplay.Display() window = display.screen().root.create_window(0,0, 1,1, 0, X.CopyFromParent) print( get_selection(display, window, "CLIPBOARD", "UTF8_STRING") or \ get_selection(display, window, "CLIPBOARD", "STRING") ) 

Puedes hacer esto con pygtk . Una solución limpia, pero puede ser un poco excesivo dependiendo de su aplicación.

Otro método que obtiene algunos google – hits es hacer una llamada al sistema de xsel .

puede que este hilo le resulte útil: ¿de qué manera el portapapeles X11 maneja múltiples formatos de datos?

Usando el módulo clipboard

Primero, instale el módulo del clipboard usando pip3 :

 $ sudo pip3 install clipboard 

El uso de este módulo multiplataforma (Linux, Mac, Windows) es bastante sencillo:

 import clipboard clipboard.copy('text') # Copy to the clipboard. text = clipboard.paste() # Copy from the clipboard.