¿Cómo copio una cadena al portapapeles?

8 minutos de lectura

¿Como copio una cadena al portapapeles
ensayador

Estoy tratando de crear una aplicación básica de Windows que cree una cadena a partir de la entrada del usuario y luego la agregue al portapapeles. ¿Cómo copio una cadena al portapapeles usando Python?

  • Relacionado con esta pregunta.

    – glglgl

    15 de noviembre de 2012 a las 13:48


  • jaraco.clipboard lo hace (también): clipboard.copy(variable)

    – JinSnow

    23 de noviembre de 2016 a las 15:54


  • También vea mi respuesta a una pregunta relacionada sobre copiar al portapapeles usando Tkinter sin mostrar una ventana. Incluye una función de Python que reemplaza/devuelve el texto del portapapeles usando Tkinter.

    – Eduardo

    22 de octubre de 2017 a las 13:32

¿Como copio una cadena al portapapeles
atomizador

Realmente, pywin32 y ctypes parecen ser una exageración para esta tarea simple. Tkinter es un marco de GUI multiplataforma, que viene con Python de forma predeterminada y tiene métodos de acceso al portapapeles junto con otras cosas interesantes.

Si todo lo que necesita es poner texto en el portapapeles del sistema, esto lo hará:

from Tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('i can has clipboardz?')
r.update() # now it stays on the clipboard after the window is closed
r.destroy()

Y eso es todo, no hay necesidad de perder el tiempo con bibliotecas de terceros específicas de la plataforma.

Si está utilizando Python 3, reemplace TKinter con tkinter.

  • Obtener contenido del portapapeles: resultado = r.selection_get(selection = “CLIPBOARD”)

    –Michael Allan Jackson

    13 de julio de 2011 a las 3:19


  • @SurDin Tkinter pasó a llamarse tkinter en python 3, por lo que depende de la versión que esté usando.

    – Abe honesto

    27 de marzo de 2012 a las 0:53

  • todas mis aplicaciones dejan de responder después de pegar el contenido del portapapeles con esta función, extrañamente, obtener el resultado funciona bien.

    – Bartlomiej Lewandowski

    2 de febrero de 2013 a las 20:53

  • Funciona si no llamo r.destroy(). Una vez que llamo eso, el portapapeles se vacía y presionar Ctrl-V puede hacer que la aplicación de destino se congele. (SO: Windows 7 x64)

    – netvope

    24 de agosto de 2013 a las 3:45

  • Para mí, esto no funciona para Python 3.4, pero funciona para Python 2.7 (sí, con tkinter en lugar de Tkinter)

    – Matty

    1 oct 2015 a las 15:58

1646755091 923 ¿Como copio una cadena al portapapeles
usuario1227883

No tenía una solución, solo una solución alternativa.

Windows Vista en adelante tiene un comando incorporado llamado clip que toma la salida de un comando de la línea de comando y lo coloca en el portapapeles. Por ejemplo, ipconfig | clip.

Así que hice una función con el os módulo que toma una cadena y la agrega al portapapeles usando la solución de Windows incorporada.

import os
def addToClipBoard(text):
    command = 'echo ' + text.strip() + '| clip'
    os.system(command)

# Example
addToClipBoard('penny lane')

# Penny Lane is now in your ears, eyes, and clipboard.

Sin embargo, como se señaló anteriormente en los comentarios, una desventaja de este enfoque es que el echo El comando agrega automáticamente una nueva línea al final de su texto. Para evitar esto, puede usar una versión modificada del comando:

def addToClipBoard(text):
    command = 'echo | set /p nul=" + text.strip() + "| clip'
    os.system(command)

Si está utilizando Windows XP, funcionará simplemente siguiendo los pasos en Copie y pegue desde el símbolo del sistema de Windows XP Pro directamente al Portapapeles.

  • Qué pasa si text contiene | calc.exe ?

    – Willi Ballenthin

    18 de enero de 2013 a las 19:36

  • @WilliBallenthin, entonces debe envolverlo entre comillas dobles. Pero, ¿y si CONTIENE comillas dobles? Entonces necesitas duplicar las comillas dobles. text with " quotes and | pipe se convierte "text with "" quotes and | pipe" Aunque esto puede tener problemas en sistemas con windows anteriores a la 95.

    – ColBeseder

    27 mayo 2013 a las 14:52


  • Función extremadamente insegura… El contenido enviado a su portapapeles ahora es un vector de entrada y, por lo tanto, aumenta su superficie de ataque.

    – phil l

    21 de agosto de 2014 a las 12:13

  • También necesito soporte para saltos de línea, así que modifiqué esto para usar type. Escribo mi texto en el archivo y uso el comando type myfile.txt | clip.

    – Mixoptérix

    26 de enero de 2016 a las 14:06

  • Aunque esta es la mejor respuesta para mí, tiene un problema (Python 3.5, Windows 10); siempre se agrega una nueva línea no deseada al final de la cadena. ¿Cómo evitarlo?

    – mmj

    10 dic 2016 a las 10:55

Puedes usar clipper – Módulo de portapapeles multiplataforma. O fotocopia – módulo similar, excepto que requiere el módulo win32 Python para funcionar en Windows.

  • pyperclip no hace Unicode en Windows. win32clipboard lo hace.

    – Cees Timmermann

    3 de diciembre de 2014 a las 17:29

  • Mi pyperclip se aceptó el parche; c:\python34\Scripts\pip install --upgrade pyperclip para manejar texto Unicode.

    – Cees Timmermann

    5 de diciembre de 2014 a las 14:02


  • Me tomó un tiempo descubrir que esto es pyperclipno paperclip. Además, como en 2016, pyperclip también funciona con caracteres Unicode. He probado caracteres ±°©©αβγθΔΨΦåäö para trabajar en Win10 de 64 bits, con Python 3.5 y pyperclip 1.5.27.

    – np8

    3 de julio de 2016 a las 15:55


  • pyperclip también funciona en Mac y Linux (no solo en Windows), lo cual es bueno.

    –David Foster

    4 de marzo de 2021 a las 15:39

1646755092 795 ¿Como copio una cadena al portapapeles
kapace

También puede usar ctypes para aprovechar la API de Windows y evitar el paquete masivo pywin32. Esto es lo que uso (disculpen el estilo pobre, pero la idea está ahí):

import ctypes

# Get required functions, strcpy..
strcpy = ctypes.cdll.msvcrt.strcpy
ocb = ctypes.windll.user32.OpenClipboard    # Basic clipboard functions
ecb = ctypes.windll.user32.EmptyClipboard
gcd = ctypes.windll.user32.GetClipboardData
scd = ctypes.windll.user32.SetClipboardData
ccb = ctypes.windll.user32.CloseClipboard
ga = ctypes.windll.kernel32.GlobalAlloc    # Global memory allocation
gl = ctypes.windll.kernel32.GlobalLock     # Global memory Locking
gul = ctypes.windll.kernel32.GlobalUnlock
GMEM_DDESHARE = 0x2000

def Get():
  ocb(None) # Open Clip, Default task

  pcontents = gcd(1) # 1 means CF_TEXT.. too lazy to get the token thingy...

  data = ctypes.c_char_p(pcontents).value

  #gul(pcontents) ?
  ccb()

  return data

def Paste(data):
  ocb(None) # Open Clip, Default task

  ecb()

  hCd = ga(GMEM_DDESHARE, len(bytes(data,"ascii")) + 1)

  pchData = gl(hCd)

  strcpy(ctypes.c_char_p(pchData), bytes(data, "ascii"))

  gul(hCd)

  scd(1, hCd)

  ccb()

Puede usar los excelentes pandas, que tienen un soporte de portapapeles incorporado, pero debe pasar a través de un DataFrame.

import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)

  • +1. Me gusta esta solución. Es incluso más simple que la solución Tkinter aceptada. Si importó pandas de todos modos, no hay gastos generales adicionales. También funciona en todas las plataformas. Ni siquiera (en la mayoría de los casos) requiere instalar un nuevo paquete.

    – ChaimG

    2 de febrero de 2017 a las 18:04

  • esto usa pyperclip de todos modos, así que mejor uso pyperpclip

    – maxbellec

    13 de junio de 2017 a las 8:02

  • Para la mayoría de las personas (es decir, yo), pandas está fácilmente disponible pero import pyperclip no funciona Así que no estoy de acuerdo con “mejor uso de pyperclip”.

    – Doctor Núcleo

    25 de junio de 2019 a las 9:16

  • Si está restringido a usar solo pandas, puede usar pyperclip directamente a través de import pandas.io.clipboard as pyperclip o ponle el nombre que quieras. Ahí es donde se sienta dentro pandaspor lo menos

    –David Culbreth

    29 oct 2019 a las 18:36


  • Esto parece agregar un carácter de nueva línea a la cadena que copias

    – Gijs van Oort

    14 de mayo de 2020 a las 8:02

La forma más sencilla es con clipper. Funciona en python 2 y 3.

Para instalar esta biblioteca, utilice:

pip install pyperclip

Ejemplo de uso:

import pyperclip

pyperclip.copy("your string")

Si desea obtener el contenido del portapapeles:

clipboard_content = pyperclip.paste()

  • +1. Me gusta esta solución. Es incluso más simple que la solución Tkinter aceptada. Si importó pandas de todos modos, no hay gastos generales adicionales. También funciona en todas las plataformas. Ni siquiera (en la mayoría de los casos) requiere instalar un nuevo paquete.

    – ChaimG

    2 de febrero de 2017 a las 18:04

  • esto usa pyperclip de todos modos, así que mejor uso pyperpclip

    – maxbellec

    13 de junio de 2017 a las 8:02

  • Para la mayoría de las personas (es decir, yo), pandas está fácilmente disponible pero import pyperclip no funciona Así que no estoy de acuerdo con “mejor uso de pyperclip”.

    – Doctor Núcleo

    25 de junio de 2019 a las 9:16

  • Si está restringido a usar solo pandas, puede usar pyperclip directamente a través de import pandas.io.clipboard as pyperclip o ponle el nombre que quieras. Ahí es donde se sienta dentro pandaspor lo menos

    –David Culbreth

    29 oct 2019 a las 18:36


  • Esto parece agregar un carácter de nueva línea a la cadena que copias

    – Gijs van Oort

    14 de mayo de 2020 a las 8:02

Esta es la forma más fácil y confiable que encontré si estás bien dependiendo de Pandas. Sin embargo, no creo que esto sea oficialmente parte de la API de Pandas, por lo que puede fallar con futuras actualizaciones. Funciona a partir de la 0.25.3

from pandas.io import clipboard
clipboard.copy("test")

  • Funciona para mí, excepto que podría usar from pandas.io import clipboard luego clipboard.copy(...) para evitar confusiones con otros copy métodos.

    – nekomático

    29 de julio de 2020 a las 19:47

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad