2011-09-30 9 views
14

Ad esempio, se uno script python sputerà una stringa che fornisce il percorso di un file appena scritto che sto per modificare immediatamente dopo aver eseguito lo script, sarebbe molto bello averlo direttamente inviato agli appunti del sistema piuttosto di STDOUT.C'è un modo per inviare direttamente un output Python agli appunti?

+0

La soluzione sarebbe dipendente dal sistema operativo, va bene? – NullUserException

+0

@NullUserException ఠ_ఠ Suppongo che lo sarebbe, ma sto lavorando interamente su Linux, quindi mi piacerebbe una soluzione per Linux. – nye17

risposta

22

è possibile utilizzare un programma esterno, xsel:

from subprocess import Popen, PIPE 
p = Popen(['xsel','-pi'], stdin=PIPE) 
p.communicate(input='Hello, World') 

Con xsel, è possibile impostare gli appunti che si desidera lavorare.

  • -p funziona con la selezione PRIMARY. Quello è il clic medio.
  • -s funziona con la selezione SECONDARY. Non so se questo è più usato.
  • -b funziona con la selezione CLIPBOARD. Questo è il tuo Ctrl + V.

Ulteriori informazioni sugli Appunti di X here e here.

Una funzione veloce e sporco ho creato per gestire questa situazione:

def paste(str, p=True, c=True): 
    from subprocess import Popen, PIPE 

    if p: 
     p = Popen(['xsel', '-pi'], stdin=PIPE) 
     p.communicate(input=str) 
    if c: 
     p = Popen(['xsel', '-bi'], stdin=PIPE) 
     p.communicate(input=str) 

paste('Hello', False) # pastes to CLIPBOARD only 
paste('Hello', c=False) # pastes to PRIMARY only 
paste('Hello')   # pastes to both 

Potete anche provare di clipboard pyGTK:

import pygtk 
pygtk.require('2.0') 
import gtk 

clipboard = gtk.clipboard_get() 

clipboard.set_text('Hello, World') 
clipboard.store() 

Questo funziona con la Ctrl + V selezione per me.

+0

Ho provato questo snippet ma sembra che non funzioni per le mie impostazioni. Dopo aver eseguito 'python abovescript.py', poi ho fatto clic con il tasto sinistro del mouse nel terminale, ma non compare' Hello, World'. – nye17

+0

@ nye17 Quale metodo stai provando? Ti dà errori? – NullUserException

+1

Il primo 'Clipboard', non funziona ma nessun errore riportato. – nye17

10

Questa non è una domanda di Python ma una domanda di shell. È già possibile inviare l'output di uno script Python (o qualsiasi altro comando) negli Appunti anziché lo standard, piping l'output dello script Python nel comando xclip.

myscript.py | xclip 

Se xclip non è già installato sul vostro sistema (non è di default), questo è come lo si ottiene:

sudo apt-get install xclip 

Se si voleva farlo direttamente dal vostro script Python Immagino che si possa eseguire lo shell out ed eseguire il comando xclip usando os.system() che è semplice ma deprecato. Ci sono diversi modi per farlo (vedi il modulo subprocess per il modo ufficiale corrente). Il comando che ci si vuole eseguire è qualcosa di simile:

echo -n /path/goes/here | xclip 

Bonus: In Mac OS X, è possibile fare la stessa cosa con tubazioni in pbcopy.

+0

Preferisco che la stringa specificata dallo script venga inviata negli appunti, piuttosto che tutto l'output che viene inviato a 'xclip', poiché l'output finale e la stringa desiderata non sono necessariamente uguali. Ma hai ragione, posso usare "sottoprocesso" per inviarlo a "xclip", anche se preferirei un modo leggermente meno "forza bruta". – nye17

+0

farlo in python è più bello - consente al codice di avere più output di un semplice nome file ... – tobyodavies

+0

Aggiungi un flag della riga di comando per sopprimere tutto tranne il nome del percorso, quindi, o eventualmente inviarlo all'errore standard (così puoi collegalo a 'xclip' senza prendere il resto). Hai bisogno di un flag della riga di comando in ogni caso, dal momento che non vuoi clobare gli appunti dell'utente senza che gli venga detto esplicitamente, quindi perché non renderlo più unixy? – kindall

2

Come altri hanno sottolineato, questo non è "Python e batterie" in quanto comporta operazioni GUI. Quindi dipende dalla piattaforma. Se sei su Windows puoi usare il modulo Python win32 e accedere alle operazioni negli appunti di win32. Il mio suggerimento sarebbe stato quello di raccogliere un toolkit GUI (PyQT/PySide per QT, PyGTK per GTK + o wxPython per wxWidgets). Quindi utilizzare le operazioni negli Appunti.Se non hai bisogno delle cose pesanti dei toolkit, allora crea il tuo wrapper che userà il pacchetto win32 su Windows e tutto ciò che è disponibile su un'altra piattaforma e cambierà di conseguenza!

Per wxPython ecco alcuni link utili:

http://www.wxpython.org/docs/api/wx.Clipboard-class.html

http://wiki.wxpython.org/ClipBoard

http://www.python-forum.org/pythonforum/viewtopic.php?f=1&t=25549

5

Come è stato pubblicato in un altro answer, se si vuole risolvere quello in python, è possibile utilizzare Pyperclip che ha il vantaggio di essere multipiattaforma.

>>> import pyperclip 
>>> pyperclip.copy('The text to be copied to the clipboard.') 
>>> pyperclip.paste() 
'The text to be copied to the clipboard.' 
Problemi correlati