For example, if a python script will spit out a string giving the path of a newly written file that I'm going to edit immediately after running the script, it would be very nice to have it directly sent to the system clipboard rather than STDOUT
.
-
The solution would be OS dependent, is that alright?– NullUserExceptionCommented Sep 30, 2011 at 4:50
-
@NullUserExceptionఠ_ఠ I assume it would be, but I'm working entirely inside Linux, so I would like a solution for Linux.– nye17Commented Sep 30, 2011 at 4:51
4 Answers
You can use an external program, xsel
:
from subprocess import Popen, PIPE
p = Popen(['xsel','-pi'], stdin=PIPE)
p.communicate(input='Hello, World')
With xsel
, you can set the clipboard you want to work on.
-p
works with thePRIMARY
selection. That's the middle click one.-s
works with theSECONDARY
selection. I don't know if this is used anymore.-b
works with theCLIPBOARD
selection. That's yourCtrl + V
one.
Read more about X's clipboards here and here.
A quick and dirty function I created to handle this:
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
You can also try pyGTK's clipboard
:
import pygtk
pygtk.require('2.0')
import gtk
clipboard = gtk.clipboard_get()
clipboard.set_text('Hello, World')
clipboard.store()
This works with the Ctrl + V
selection for me.
-
I tested this snippet but it seems it doesn't work for my settings. After doing
python abovescript.py
, then I middle-clicked my mouse in the terminal, but noHello, World
shows up.– nye17Commented Sep 30, 2011 at 5:01 -
@nye17 Which method are you trying? Does it give you any errors? Commented Sep 30, 2011 at 5:03
-
1The first
clipboard
one, doesn't work but no errors reported at all.– nye17Commented Sep 30, 2011 at 5:04 -
There are two different clipboards in most Linux systems - the middle click and the
ctrl+c
/ctrl+v
clipboards. check the other one - the middle click clipboard is managed at a lower level then GTK IIRC. Commented Sep 30, 2011 at 5:05 -
The second
xsel
doesn't work either. Could it be because of my window manager? I'm using terminator under Xmoand in Debian.– nye17Commented Sep 30, 2011 at 5:06
This is not really a Python question but a shell question. You already can send the output of a Python script (or any command) to the clipboard instead of standard out, by piping the output of the Python script into the xclip
command.
myscript.py | xclip
If xclip
is not already installed on your system (it isn't by default), this is how you get it:
sudo apt-get install xclip
If you wanted to do it directly from your Python script I guess you could shell out and run the xclip command using os.system()
which is simple but deprecated. There are a number of ways to do this (see the subprocess
module for the current official way). The command you'd want to execute is something like:
echo -n /path/goes/here | xclip
Bonus: Under Mac OS X, you can do the same thing by piping into pbcopy
.
-
I prefer if the string specified by the script be sent to the clipboard, rather than all the output being piped to
xclip
, as the final output and the desired string are not necessarily the same. But you are right, I can usesubprocess
to send it toxclip
, although I would prefer a slightly less "brute-force" way.– nye17Commented Sep 30, 2011 at 5:13 -
doing it in python is nicer - allows the code to have more output than just a filename... Commented Sep 30, 2011 at 5:15
-
Add a command-line flag to suppress everything but the pathname, then, or to optionally send it to standard error (so you can pipe it to
xclip
without catching the rest). You need a command-line flag anyway since you don't want to clobber the user's clipboard without being explicitly told to, so why not make it more unixy?– kindallCommented Sep 30, 2011 at 5:20 -
-
A good reason not to use xclip: you don't control the shell environment necessarily. None of the cloud servers that I work on provide xsel or xclip, so a pure-python solution is much preferred. Commented Jul 9, 2015 at 17:41
As others have pointed out this is not "Python and batteries" as it involves GUI operations. So It is platform dependent. If you are on windows you can use win32 Python Module and Access win32 clipboard operations. My suggestion though would be picking up one GUI toolkit (PyQT/PySide for QT, PyGTK for GTK+ or wxPython for wxWidgets). Then use the clipboard operations. If you don’t need the heavy weight things of toolkits then make your wrapper which will use win32 package on windows and whatever is available on other platform and switch accordingly!
For wxPython here are some helpful links:
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