2009-12-01 6 views

Respuesta

7

Nueva respuesta:

This page sugiere:

Implementación para Todos Mac OS X Versiones

el otro módulo Mac (MacSharedClipboard.py, en el Listado 4) implementa la interfaz del portapapeles en parte superior de dos comandos -line programas llamado pbcopy (que copia el texto en el portapapeles) y pbpaste (que pega cualquier texto que esté en el portapapeles ). El prefijo "pb" significa "pasteboard", el término Mac para el portapapeles .

vieja respuesta:

Parece que sí:

http://code.activestate.com/recipes/410615/

es un simple script que demuestra cómo hacerlo.

Editar: Me acabo de dar cuenta de que esto se basa en carbono, por lo que podría no ser ideal ... depende un poco para lo que lo está usando.

+0

nunca pensé de utilizar una herramienta de línea de comandos. Perfecto, gracias –

+0

Ese ejemplo de código no maneja las cadenas Unicode correctamente. He proporcionado una solución consciente de Unicode como una respuesta separada. –

14

La siguiente utilice el código de PyObjC (http://pyobjc.sourceforge.net/)

from AppKit import NSPasteboard, NSArray 

pb = NSPasteboard.generalPasteboard() 
pb.clearContents() 
a = NSArray.arrayWithObject_("hello world") 
pb.writeObjects_(a) 

Como explained in Cocoa documentation, copia requiere tres pasos:

  • conseguir la mesa de trabajo
  • claro que
  • llenarlo

Rellena el portapapeles con una matriz de objetos (aquí a contiene solo una cadena).

2

si solo desea poner texto en el portapapeles del mac, puede usar el comando pbcopy del intérprete de comandos.

+0

Si es un comando python supercorto, puede canalizar la salida del comando a pbcopy de la siguiente manera: python -c "print 'hi'" | pbcopy. También puede incluir un grupo de comandos consecutivos: python -c 'import time, sys; sys.stdout.write (str (int (time.time()))) '| pbcopy. Éste copia el tiempo de Unix sin la nueva línea al portapapeles. –

11

Una manera simple:

cmd = 'echo %s | tr -d "\n" | pbcopy' % str 
os.system(cmd) 

Una forma multiplataforma:
https://stackoverflow.com/a/4203897/805627

from Tkinter import Tk 
r = Tk() 
r.withdraw() 
r.clipboard_clear() 
r.clipboard_append('i can has clipboardz?') 
r.destroy() 
+3

Esto no parece funcionar en mi OS X 10.8. – Vojto

+1

El bloque de código # 1 probablemente no funciona si el texto que se va a escribir en el portapapeles contiene Unicode o caracteres de shell como | o & El bloque de código n. ° 2 crea un icono de dock extra en OS X. He proporcionado mi propia respuesta a esta pregunta que no tiene estos problemas. –

46

Cómo escribir una cadena Unicode en el portapapeles Mac:

import subprocess 

def write_to_clipboard(output): 
    process = subprocess.Popen(
     'pbcopy', env={'LANG': 'en_US.UTF-8'}, stdin=subprocess.PIPE) 
    process.communicate(output.encode('utf-8')) 

Cómo para leer una cadena Unicode desde el portapapeles de Mac:

import subprocess 

def read_from_clipboard(): 
    return subprocess.check_output(
     'pbpaste', env={'LANG': 'en_US.UTF-8'}).decode('utf-8') 

Funciona tanto en Python 2.7 como en Python 3.4.

+1

No tengo idea de por qué este tiene tan poco amor, es de lejos el método más elegante y confiable en esta página – zsero

+1

Por qué gracias. Necesitaba escribir esta función para enviar texto en japonés a través del portapapeles, así que tuve que hacerlo funcionar con Unicode. –

+0

Excelente. Muy útil en una función de utilidad para limpiar extractos de archivos pdf JSTOR; Gracias. – cphlewis

4

Sé que esta es una publicación anterior, pero encontré una solución muy elegante para este problema.

Hay una biblioteca llamada PyClip, que se puede encontrar en https://github.com/georgefs/pyclip-copycat.

La sintaxis es bastante simple (ejemplo desde el repositorio de Github):

import clipboard 

# copy some text to the clipboard 
clipboard.copy('blah blah blah') 

# get the text currently held in the clipboard 
text = clipboard.paste() 

vez que haya pasado clipboard.copy('foo') que sólo puede cmd + v para obtener el texto

Cuestiones relacionadas