2011-09-30 125 views
14

例如,如果一个python脚本会吐出一个字符串,给出一个新编写的文件的路径,我将在运行该脚本后立即编辑这个文件,将它直接发送到系统剪贴板会非常好比STDOUT有没有办法直接发送python输出到剪贴板?

+0

该解决方案将取决于操作系统,是否没问题? – NullUserException

+0

@NullUserExceptionఠ_ఠ我假设它会,但我完全在Linux内部工作,所以我想要一个针对Linux的解决方案。 – nye17

回答

22

您可以使用外部程序,xsel

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

随着xsel,你可以设置你想要的工作剪贴板上。

  • -p适用于PRIMARY选择。这是中间点击一个。
  • -s适用于SECONDARY选择。我不知道这是否被使用了。
  • -b适用于CLIPBOARD选择。那是你的Ctrl + V之一。

了解更多关于X的剪贴板herehere

一个快速和肮脏的功能,我创建的处理这个问题:

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 

您也可以尝试的PyGTK的clipboard

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

clipboard = gtk.clipboard_get() 

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

这工作与Ctrl + V选择我。

+0

我测试了这个片段,但它似乎不适用于我的设置。做完'python abovescript.py'后,我在终端中点击我的鼠标,但是没有'Hello,World'出现。 – nye17

+0

@ nye17你在尝试哪种方法?它会给你什么错误? – NullUserException

+1

第一个“剪贴板”一个,不起作用,但根本没有错误报告。 – nye17

10

这不是一个真正的Python问题,而是一个shell问题。通过将Python脚本的输出传送到xclip命令中,您可以将Python脚本(或任何命令)的输出发送到剪贴板而不是标准输出。

myscript.py | xclip 

如果xclip尚未安装在系统上(它不是默认情况下),你这是怎么得到它:

sudo apt-get install xclip 

如果你想直接从您的Python脚本做我想你可以掏腰包并使用os.system()运行xclip命令,这很简单但不推荐使用。有许多方法可以做到这一点(请参阅subprocess模块,了解当前的官方方式)。你要执行的命令是这样的:

echo -n /path/goes/here | xclip 

奖励:在Mac OS X中,可以通过管道进入pbcopy做同样的事情。

+0

我更喜欢将脚本指定的字符串发送到剪贴板,而不是将所有输出传送到'xclip',因为最终输出和所需字符串不一定相同。但是你是对的,我可以使用'subprocess'将它发送到'xclip',尽管我宁愿稍微不那么“蛮力”的方式。 – nye17

+0

在python中这样做更好 - 允许代码输出的不仅仅是文件名... – tobyodavies

+0

添加一个命令行标志来抑制除了路径名之外的所有内容,或者可选地将其发送到标准错误(所以你可以将它连接到'xclip'而不会引起其他问题)。无论如何,你都需要一个命令行标志,因为你不想在没有被明确告知的情况下摧毁用户的剪贴板,为什么不让它更加unixy? – kindall

2

正如其他人指出,这不是“Python和电池”,因为它涉及到GUI操作。所以它是平台依赖的。如果你在windows上,你可以使用win32 Python模块和Access win32剪贴板操作。 我的建议是挑选一个GUI工具包(用于QT的PyQT/PySide,用于GTK +的PyGTK或用于wxWidgets的wxPython)。然后使用剪贴板操作。如果你不需要工具包的重量级的东西,那么你的包装将在Windows上使用win32包装,并在其他平台上提供,并相应切换!

对于wxPython的下面是一些有用的链接:

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

由于它被张贴在另一个answer,如果你想解决蟒之内,你可以使用Pyperclip,它具有跨平台的附加好处。

>>> import pyperclip 
>>> pyperclip.copy('The text to be copied to the clipboard.') 
>>> pyperclip.paste() 
'The text to be copied to the clipboard.' 
相关问题