【问题标题】:Is there a way to directly send a python output to clipboard?有没有办法直接将 python 输出发送到剪贴板?
【发布时间】:2011-09-30 04:48:38
【问题描述】:

例如,如果一个 python 脚本会输出一个字符串,给出一个新写入的文件的路径,我将在运行脚本后立即对其进行编辑,将它直接发送到系统剪贴板会非常好而不是STDOUT

【问题讨论】:

  • 解决方案将取决于操作系统,可以吗?
  • @NullUserExceptionఠ_ఠ 我想会是这样,但我完全在 Linux 中工作,所以我想要一个适用于 Linux 的解决方案。

标签: python linux clipboard


【解决方案1】:

您可以使用外部程序,xsel:

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

使用xsel,您可以设置要处理的剪贴板。

  • -pPRIMARY 选择一起使用。这就是中间点击。
  • -sSECONDARY 选择一起使用。不知道这个还有没有用。
  • -bCLIPBOARD 选择一起使用。那是你的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 选择。

【讨论】:

  • 我测试了这个 sn-p 但它似乎不适用于我的设置。完成python abovescript.py 之后,我在终端中单击鼠标中键,但没有出现Hello, World
  • @nye17 您在尝试哪种方法?它会给你任何错误吗?
  • 第一个clipboard,不起作用但完全没有报错。
  • 在大多数 Linux 系统中有两种不同的剪贴板 - 中键和 ctrl+c/ctrl+v 剪贴板。检查另一个 - 中间单击剪贴板的管理级别低于 GTK IIRC。
  • 第二个xsel 也不起作用。可能是因为我的窗口管理器?我在 Debian 的 Xmoand 下使用终结器。
【解决方案2】:

正如它在另一个answer 中发布的那样,如果您想在python 中解决这个问题,您可以使用Pyperclip,它具有跨平台的额外好处。

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

【讨论】:

    【解决方案3】:

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

    myscript.py | xclip
    

    如果您的系统上尚未安装xclip(默认情况下未安装),您可以通过以下方式获取它:

    sudo apt-get install xclip
    

    如果您想直接从您的 Python 脚本中执行此操作,我想您可以使用 os.system() 来运行 xclip 命令,这很简单但已弃用。有很多方法可以做到这一点(请参阅subprocess 模块了解当前的官方方式)。您要执行的命令类似于:

    echo -n /path/goes/here | xclip
    

    奖励:在 Mac OS X 下,您可以通过管道输入 pbcopy 来做同样的事情。

    【讨论】:

    • 我更喜欢将脚本指定的字符串发送到剪贴板,而不是将所有输出通过管道传送到xclip,因为最终输出和所需的字符串不一定相同。但你是对的,我可以使用subprocess 将其发送给xclip,尽管我更喜欢稍微不那么“蛮力”的方式。
    • 在 python 中做这件事更好——允许代码有更多的输出,而不仅仅是一个文件名......
    • 添加一个命令行标志来禁止除路径名之外的所有内容,或者选择将其发送到标准错误(因此您可以将其通过管道发送到 xclip 而不会捕获其余部分)。无论如何,您都需要一个命令行标志,因为您不想在没有明确告知的情况下破坏用户的剪贴板,那么为什么不让它更加统一呢?
    • @kindall 这次我想要更多的pythonic ;-)
    • 不使用 xclip 的一个很好的理由:您不必控制 shell 环境。我工作的云服务器都没有提供 xsel 或 xclip,因此更倾向于使用纯 Python 解决方案。
    【解决方案4】:

    正如其他人所指出的,这不是“Python 和电池”,因为它涉及 GUI 操作。所以它是平台相关的。如果您在 Windows 上,您可以使用 win32 Python 模块和访问 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-24
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2011-07-05
      • 1970-01-01
      相关资源
      最近更新 更多