【问题标题】:Python script to copy text to clipboard [duplicate]Python脚本将文本复制到剪贴板[重复]
【发布时间】:2012-06-19 06:40:44
【问题描述】:

我只需要一个将文本复制到剪贴板的 python 脚本。

脚本执行后,我需要将文本的输出粘贴到另一个源。 是否可以编写一个 python 脚本来完成这项工作?

【问题讨论】:

标签: python clipboard pyperclip


【解决方案1】:

Pyperclip。示例(取自 Pyperclip 网站):

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

另外,请参阅Xerox。但它似乎有更多的依赖关系。

【讨论】:

  • 我在我的系统上试过了,.setcb 不起作用,但 .copy 可以。我在 py 2.7 上使用 pyperclip 1.5.4。以防万一有人遇到同样的问题 - @robert,我很想知道为什么这种语法在你的系统上有效,但在我的系统上无效。
  • .copy 似乎是官方的。 github.com/asweigart/pyperclip
  • @VincentTjeng 更新
  • 如果从脚本运行后复制的文本不存在,请参考this issue的解决方法。
【解决方案2】:

在 macOS 上,使用 subprocess.run 将您的文本通过管道传输到 pbcopy

import subprocess 
data = "hello world"
subprocess.run("pbcopy", universal_newlines=True, input=data)

它将“hello world”复制到剪贴板。

【讨论】:

  • Windows 用户可以使用 clip 命令代替 pbcopy。
  • 对我不起作用 - 剪贴板具有相同的数据,Python 3.5.2
  • windows中短暂弹出cmd窗口
  • 我在 linux 中使用 xselecho 'CUSTOM STRING' | xsel --clipboard --input 。 python的使用示例subprocess.Popen(['/bin/sh', '-c', f'echo "{123}" | xsel --clipboard --input'])
  • 你可以在 Linux 中用xclip 代替pbcopy
【解决方案3】:

要使用本机 Python 目录,请使用:

import subprocess

def copy2clip(txt):
    cmd='echo '+txt.strip()+'|clip'
    return subprocess.check_call(cmd, shell=True)

在 Mac 上,改为:

import subprocess

def copy2clip(txt):
    cmd='echo '+txt.strip()+'|pbcopy'
    return subprocess.check_call(cmd, shell=True)

然后使用:

copy2clip('This is on my clipboard!')

调用函数。

【讨论】:

  • CalledProcessError Traceback (最近一次调用最后一次) in () 4 cmd='echo '+txt.strip()+'|clip' 5 return subprocess.check_call(cmd, shell=True) ----> 6 copy2clip('This is on my clipboard!') in copy2clip(txt) 3 def copy2clip(txt): 4 cmd ='echo '+txt.strip()+'|clip' ----> 5 return subprocess.check_call(cmd, shell=True) ... CalledProcessError: Command 'echo This is on my clipboard!|clip' 返回非零退出状态 127
  • 这可行,但在 Windows 上,clip 是一个仅限 Windows 的命令(有时它不是系统的一部分,您必须在 WinXP 上手动下载并安装它)
  • 看起来不错,但多了一个 '\n'。
  • 这是一个安全隐患,因为它容易受到外壳注入攻击。
  • -1。脱壳是一种明智的处理方式,但正如@Hatshepsut 所说,示例代码非常危险且不可靠,即使有人没有积极尝试破解某些东西。剪贴板上可能有各种各样的东西,它们可能会无意中运行命令,或者至少会导致语法错误。
【解决方案4】:

PyQt5:

from PyQt5.QtWidgets import QApplication
import sys

def main():
    app = QApplication(sys.argv)
    cb = QApplication.clipboard()
    cb.clear(mode=cb.Clipboard )
    cb.setText("Copy to ClipBoard", mode=cb.Clipboard)
    # Text is now already in the clipboard, no need for further actions.
    sys.exit()

if __name__ == "__main__":
    main()

【讨论】:

  • 如果您使用QApplication.clipboard(),则无需导入QClipboard
【解决方案5】:

GTK3:

#!/usr/bin/python3

from gi.repository import Gtk, Gdk


class Hello(Gtk.Window):

    def __init__(self):
        super(Hello, self).__init__()
        clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
        clipboard.set_text("hello world", -1)
        Gtk.main_quit()


def main():
    Hello()
    Gtk.main()

if __name__ == "__main__":
    main()

【讨论】:

    【解决方案6】:

    还有一个需要改进的答案: https://stackoverflow.com/a/4203897/2804197https://stackoverflow.com/a/25476462/1338797 (Tkinter)。

    Tkinter 很好,因为它要么包含在 Python (Windows) 中,要么易于安装 (Linux),因此最终用户几乎不需要依赖。

    这里有一个“成熟”的示例,它将参数或标准输入复制到剪贴板,并且 - 当不在 Windows 上时 - 等待用户关闭应用程序:

    import sys
    
    try:
        from Tkinter import Tk
    except ImportError:
        # welcome to Python3
        from tkinter import Tk
        raw_input = input
    
    r = Tk()
    r.withdraw()
    r.clipboard_clear()
    
    if len(sys.argv) < 2:
        data = sys.stdin.read()
    else:
        data = ' '.join(sys.argv[1:])
    
    r.clipboard_append(data)
    
    if sys.platform != 'win32':
        if len(sys.argv) > 1:
            raw_input('Data was copied into clipboard. Paste and press ENTER to exit...')
        else:
            # stdin already read; use GUI to exit
            print('Data was copied into clipboard. Paste, then close popup to exit...')
            r.deiconify()
            r.mainloop()
    else:
        r.destroy()
    

    这展示了:

    • 跨 Py2 和 Py3 导入 Tk
    • raw_inputprint() 兼容性
    • 在需要时“取消隐藏”Tk 根窗口
    • 在 Linux 上以两种不同的方式等待退出。

    【讨论】:

    • 这在 Ubuntu 14.04 LTS 上不起作用,请立即更新您的解决方案。
    • @VickyDev - 它是在 Ubuntu 14.04 LTS 上开发的,并且可以正常工作。试试sudo apt-get install python-tk,顺便说一句。
    • 在 Windows 10 中,这只是在尝试粘贴时冻结,所以我不推荐
    【解决方案7】:

    这是@Martin Thoma 对GTK3 的回答的修改版本。我发现最初的解决方案导致进程永无止境,当我调用脚本时我的终端挂起。将脚本更改为以下内容为我解决了这个问题。

    #!/usr/bin/python3
    
    from gi.repository import Gtk, Gdk
    import sys
    from time import sleep
    
    class Hello(Gtk.Window):
    
        def __init__(self):
            super(Hello, self).__init__()
    
            clipboardText = sys.argv[1]
            clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
            clipboard.set_text(clipboardText, -1)
            clipboard.store()
    
    
    def main():
        Hello()
    
    
    
    if __name__ == "__main__":
        main()
    

    您可能想要更改分配给剪贴板文本的内容,在此脚本中,它被分配给调用脚本时使用的参数。

    在全新的 ubuntu 16.04 安装中,我发现我必须安装 python-gobject 包才能使其正常工作而不会出现模块导入错误。

    【讨论】:

      【解决方案8】:

      我尝试了这个剪贴板 0.0.4,它运行良好。

      https://pypi.python.org/pypi/clipboard/0.0.4

      import clipboard
      clipboard.copy("abc")  # now the clipboard content will be string "abc"
      text = clipboard.paste()  # text will have the content of clipboard
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多