Copie los datos del portapapeles en Linux, Mac y Windows con un solo script de Python

Estoy tratando de crear un script en Python que recostackrá los datos que el usuario coloca en el portapapeles y, preferiblemente, los guardará como una lista o en un archivo de texto o cadena / matriz / variable para trabajar más adelante.

Esto debería funcionar en todas las versiones de Linux (yo asumiría Ubuntu), todas las versiones de Mac OS y todas las versiones de Windows. No estoy seguro de si los sistemas de 32 bits y de 64 bits tienen diferentes formas de acceder a los datos en el portapapeles, si es así, creo que sería seguro hacer que esto funcione solo para las versiones de 32 bits, de modo que las personas que ejecutan las versiones de 64 bits puedan volver a utilizarlo. Versión del sistema operativo.

La parte difícil, aparte de tener que trabajar en el sistema operativo mencionado, es que me gustaría que el script se ejecute siempre que el usuario no lo detenga y mientras ejecuta todos los datos copiados en el portapapeles por parte del usuario, se está copiando. a una lista o en un archivo de texto o cadena / matriz / variable.

Por supuesto, hay un límite de tiempo en el cual el usuario puede ingresar datos en el portapapeles, así que estaba pensando en hacer un bucle que escanea el portapapeles cada segundo o cada 500 milisegundos, verifique si el contenido ha cambiado y si lo ha hecho, cópielo. de lo contrario no lo copie.

¿Hay una forma o módulo unificado que haga esto en todos los sistemas operativos diferentes o sería mejor escribir scripts separados para esta tarea para los diferentes sistemas operativos?

La cuestión es que esto es parte de un proyecto más grande que me gustaría hacer funcionar en Linux, Mac y Windows, por lo que tener esas tres opciones cubiertas y luego usar el código de Python que se puede usar en el sistema operativo mencionado para el rest del script / proyecto sería ideal. ¿Estoy preguntando demasiado en general acerca de este script que tiene que trabajar en Linux, Mac y Windows?

Podría usar un kit de herramientas GUI como Qt para obtener una API de portapapeles portátil. Dicho esto, podría ser un poco excesivo utilizar un conjunto completo de herramientas GUI solo para esto. (A menos que, por supuesto, también lo vayas a usar para hacer una GUI).

Dicho esto, las API del portapapeles que tratan con texto sin formato deberían ser razonablemente simples para hacer su propia abstracción.

Por ejemplo, en OS X puede usar PyObjC (que se instala junto con OS X) para obtener los contenidos de texto sin formato de un portapapeles:

from AppKit import NSPasteboard from LaunchServices import pb = NSPasteboard.generalPasteboard() text = pb.stringForType_(kUTTypeUTF8PlainText) 

Arquitecturas de CPU

Una aplicación nativa de 32 bits en un sistema operativo de 64 bits accederá al mismo portapapeles que a una de 64 bits. Si necesita admitir ambas architectures de un sistema operativo y no está escribiendo un controlador, para Windows está bien enviar un binario de 32 bits; para Linux es probable que tengas que hacer ambas versiones; para OS X, debería ser razonablemente seguro enviar una versión de 64 bits, todas las Mac desde mediados de 2007 han tenido CPU de 64 bits y el soporte del sistema operativo está ahí desde Leopard. Un script de Python, en Linux, probablemente será ejecutado por una instalación de Python desde el administrador de paquetes de distribución, cuyo bitness coincidirá con el sistema, por lo que no necesariamente tiene que preocuparse por eso.

La biblioteca de xerox es compatible con Linux, Mac OS X y Windows.

Tenga en cuenta que es una muy mala idea realizar cualquier acción en intervalos cortos (

Probablemente estés mejor usando un kit de herramientas de gui más avanzado que Tk, pero está en la biblioteca estándar, por lo que está disponible en todas partes.

Como un ejemplo muy simple:

 import Tkinter root = Tkinter.Tk() root.withdraw() # Hide the main window (optional) text_in_clipboard = root.clipboard_get() print text_in_clipboard 

El sondeo NO es robusto / confiable.

No puede determinar si los datos han cambiado (en Windows de todos modos) sin pegarlos en un búfer para su inspección. Esto requiere abrir el portapapeles. Si haces esto en un bucle, vas a chocar con otras aplicaciones. es decir, la aplicación donde el usuario está copiando otro elemento en el portapapeles. Esto explotará con un error de “no se puede abrir el portapapeles” o “sin memoria”. Este enfoque no funcionará de manera confiable / robusta. Debe utilizar las API adecuadas de monitorización del portapapeles en las distintas plataformas.