Python能否将文本发送到Mac剪贴板?

49
我希望我的Python程序可以将一些文本放入Mac系统的剪贴板中。
这个可能吗?
7个回答

114

如何将Unicode字符串写入Mac剪贴板:

import subprocess

def write_to_clipboard(output):
    process = subprocess.Popen(
        'pbcopy', env={'LANG': 'en_US.UTF-8'}, stdin=subprocess.PIPE)
    process.communicate(output.encode('utf-8'))

如何从Mac剪贴板读取Unicode字符串:

import subprocess

def read_from_clipboard():
    return subprocess.check_output(
        'pbpaste', env={'LANG': 'en_US.UTF-8'}).decode('utf-8')

适用于Python 2.7和Python 3.4。

2021更新:如果您需要在其他操作系统上读取剪贴板而不仅仅是Mac,并且可以添加外部库,则pyperclip似乎也可以很好地工作。 我在Mac上测试了使用Unicode文本:

python -m pip install pyperclip
python -c 'import pyperclip; pyperclip.copy("私はDavid!")'  # copy
python -c 'import pyperclip; print(repr(pyperclip.paste()))'  # paste

3
我不知道为什么这个方法得到的关注如此之少,它是这个页面上最优雅和可靠的方法。 - hyperknot
1
谢谢。我需要编写这个函数来通过剪贴板传输日语文本,所以我必须让它支持Unicode。 - David Foster
非常好。在清理JSTOR PDF文件提取时非常有用的实用函数;谢谢。 - cphlewis
比Tkinter好得多,而且更可靠。谢谢。 - Lincoln Bergeson
1
很棒的解决方案。不需要外部库。谢谢。 - Farid
@DavidFoster,我现在正在使用pyperclip,但似乎与pyautogui冲突了。会抛出有关粘贴板的属性错误。您遇到过这个问题吗?对我来说,您的第一个答案现在似乎是最好的。这是我在github上的帖子:https://github.com/asweigart/pyperclip/issues/208 - Jason

21

一个简单的方法:

cmd = 'echo %s | tr -d "\n" | pbcopy' % str
os.system(cmd)

一种跨平台的方法:
https://dev59.com/-XRB5IYBdhLWcg3wl4EQ#4203897

from Tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('i can has clipboardz?')
r.destroy()

1
代码块#1如果要写入到剪贴板的文本包含Unicode或shell字符(如|或&),则可能无法正常工作。 代码块#2会在OS X上创建一个额外的dock图标。 我已经提供了自己的答案,它没有这些问题。 - David Foster
很遗憾,跨平台的方式并不可靠。而且你也错过了原始答案中显示的 r.update() 调用。 - GhostCat

19
下面的代码使用PyObjC(https://pyobjc.readthedocs.io
from AppKit import NSPasteboard, NSArray

pb = NSPasteboard.generalPasteboard()
pb.clearContents()
a = NSArray.arrayWithObject_("hello world")
pb.writeObjects_(a)

Cocoa文档中所述, 复制需要三个步骤:

  • 获取剪贴板
  • 清空剪贴板
  • 填充剪贴板

您可以使用对象数组(这里的a仅包含一个字符串)来填充剪贴板。


8

新回答:

此页面建议:

适用于所有Mac OS X版本的实现

另一个Mac模块(List 4中的MacSharedClipboard.py)在两个命令行程序(称为pbcopy和pbpaste)之上实现了剪贴板接口,其中pbcopy将文本复制到剪贴板中,而pbpaste则粘贴剪贴板中的任何文本。前缀“pb”代表“pasteboard”,这是Mac术语,表示剪贴板。

旧回答:

显然是这样:

http://code.activestate.com/recipes/410615/是一个演示如何做到这一点的简单脚本。

编辑:刚才意识到这依赖于Carbon,因此可能不是理想的...有点取决于您要用它做什么。


我从未想过使用命令行工具。太好了,谢谢。 - David Sykes
那段代码示例没有正确处理Unicode字符串。我已经提供了一个支持Unicode的解决方案,作为另一个答案。 - David Foster

6
我知道这是一篇较旧的文章,但我找到了一个非常优雅的解决方案来解决这个问题。
有一个名为 PyClip 的库,可以在 https://github.com/georgefs/pyclip-copycat 找到。
语法非常简单(来自Github存储库的示例):
import clipboard

# copy some text to the clipboard
clipboard.copy('blah blah blah')

# get the text currently held in the clipboard
text = clipboard.paste()

一旦你执行了 clipboard.copy('foo'),你只需要使用 cmd + v 即可获取文本。


我错过了向pyperclip解释“剪贴板”优势的机会-在此处可以看到示例-剪贴板需要它。 - Timo

1
如果你只是想把文本放到 Mac 的剪贴板中,你可以使用 shell 的 pbcopy 命令。

1
如果是超短的Python命令,您可以像这样将命令的输出导入pbcopy:python -c "print 'hi'" | pbcopy。您也可以包含一系列连续的命令:python -c 'import time, sys; sys.stdout.write(str(int(time.time())))' | pbcopy。这个命令将Unix时间复制到剪贴板中而没有尾随换行符。 - Ariel Cabib

0
基于@David Foster的答案,我实现了一个简单的脚本(仅适用于Mac),将Python字典(实际上是从JSON字符串解析而来)解码为JSON字符串。因为有时在调试时,我需要查找数据中的错误(而数据体非常庞大且复杂,难以被人读取),然后我会将其粘贴到Python shell中,并json.dumps(data)并复制到VS Code中,使JSON更美观。所以下面的脚本对我的工作非常有帮助。
alias pyjson_decode_stdout='python3 -c "import sys, json, subprocess; \
    print(json.dumps(eval(subprocess.check_output( \
        \"pbpaste\", env={\"LANG\": \"en_US.UTF-8\"}).decode(\"utf-8\"))))"'
alias pyjson_decode='python3 -c "import json, subprocess; \
    output=json.dumps(eval(subprocess.check_output(\
        \"pbpaste\", env={\"LANG\": \"en_US.UTF-8\"}).decode(\"utf-8\"))).encode(\"utf-8\"); \
    process=subprocess.Popen(\"pbcopy\", env={\"LANG\": \"en_US.UTF-8\"}, stdin=subprocess.PIPE); \
    process.communicate(output)"'


将脚本添加到~/.zshrc~/.bashrc(根据您使用的sh),然后打开一个新的终端窗口,示例用法是复制一个字典数据,例如{'a': 1},然后输入pyjson_decode_stdout将基于此字典打印解析的JSON;复制并输入pyjson_decode将把此字符串写入pbcopy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接