【问题标题】:Copy data from the clipboard on Linux, Mac and Windows with a single Python script使用单个 Python 脚本从 Linux、Mac 和 Windows 上的剪贴板复制数据
【发布时间】:2023-04-06 18:14:01
【问题描述】:

我正在尝试在 Python 中创建一个脚本,该脚本将收集用户放入剪贴板的数据,并最好将其保存为列表或文本文件或字符串/数组/变量以供以后使用。

这应该适用于 Linux 所有版本(我假设是 Ubuntu)、Mac OS 所有版本和 Windows 所有版本。我不确定 32 位和 64 位系统是否有不同的方式来访问剪贴板上的数据,如果有的话,我想只在 32 位版本上进行这项工作是安全的,这样运行 64 位版本的人可以退回到 32 位操作系统的版本。

除了必须在提到的操作系统上工作之外,棘手的部分是我希望脚本运行,只要用户不停止它并且它运行用户复制到剪贴板的所有数据正在被复制到列表或文本文件或字符串/数组/变量中。

当然,用户可以将数据输入剪贴板是有时间限制的,所以我想有一个循环扫描剪贴板每秒或每 500 毫秒,检查内容是否已更改,如果有,复制它,否则不要复制它。

是否有一种统一的方式或模块可以在所有不同的操作系统上执行此操作,或者为不同的操作系统编写单独的脚本会更好?

问题是,这是一个更大的项目的一部分,我想在 Linux、Mac 和 Windows 上工作,因此涵盖了这三个选项,然后使用可在上述操作系统中使用的 Python 代码完成其余部分脚本/项目将是理想的。关于它必须在 Linux、Mac 和 Windows 上运行,我是否对该脚本提出了太多要求?

【问题讨论】:

  • 好吧,首先,并不是所有的 linux 都有剪贴板。

标签: python windows linux macos clipboard


【解决方案1】:

xerox 库支持 Linux、Mac OS X 和 Windows。

请注意,在短时间内(任何 操作是一个非常糟糕的主意,因为这会使现代处理器定期唤醒。您可能希望在剪贴板更改后使用相应操作系统的 API 来注册回调。

【讨论】:

  • 所以 xerox.copy(u) 将获取任何上述操作系统上剪贴板中的任何内容并将其复制到我分配的变量中?对我来说,我刚刚开始学习 Python,看起来我可以使用 xerox 复制和粘贴我在脚本中分配的字符串,而不是获取剪贴板中的实际内容并将其用作脚本中的用户输入变量。这是正确的吗?
  • 仅供参考:xerox 需要在 Linux 系统上安装 xclip。大多数发行版默认不包含xclip
  • 是的,谢谢您注册回调是我一定会调查的!所以这真的意味着将代码拆分为各种操作系统 API,是吗?我以为我可以在开始时以某种方式定义它,然后代码可以被所有操作系统在一个分支中读取,而不是拥有三个代码分支,每个分支用于各种操作系统,我的假设在这里是否正确?
  • @JoeKington 谢谢,您是否也知道它是否可以从剪贴板复制或从脚本中定义的代码复制到它?我希望定期从剪贴板复制数据并将其放入数组或字符串中,以便稍后由脚本使用。施乐可以从剪贴板中复制而无需事先在剪贴板中放置内容?
  • @lowtechsun 是的,只需阅读sys.platform 并根据此决定采用哪个分支。施乐只读取当前剪贴板,不管是谁设置的。请注意,Unix 系统上可能有多个剪贴板,尤其是 Linux。
【解决方案2】:

您可能最好使用比 Tk 更高级的 gui 工具包,但它在标准库中,因此随处可用。

作为一个非常简单的例子:

import Tkinter
root = Tkinter.Tk()
root.withdraw() # Hide the main window (optional)
text_in_clipboard = root.clipboard_get()
print text_in_clipboard

【讨论】:

  • 这个例子适用于所有提到的操作系统?由于@phihag 提到 Linux 上可能有多个剪贴板,因此最好首先关注 Windows 剪贴板,然后移植到 Mac 和 Linux,用户在脚本的每个新循环中复制并粘贴 URL(a)。很想避免这种情况,例如,只需单击鼠标按钮即可选择 URL(a)。
  • @lowtechsun 对于大多数应用程序,对于第一个版本,您可以放心地忽略 Linux 上的“旧”剪贴板,而只需使用称为“剪贴板”的 Ctrl-C/Ctrl-V。我怀疑强烈关注“主要”和“次要”剪贴板的人与使用自动 GUI 下载器的人之间是否存在显着重叠。
  • @Inerdia 抱歉,Linux 上的传统、主要和次要剪贴板是什么?您是说在 Linux 上让用户浏览(使用任何浏览器)到带有 URL 的页面,例如用鼠标右键单击选择它们复制链接位置与在 Mac 或 Windows 上一样容易,并且将不胜感激必须自己通过按键将 URL 复制并粘贴到脚本/GUI 中?我认为有时同步的剪贴板可能会删除内容,这不是 phihag 所暗示的吗?有什么好的论坛可以了解这个或为此建立一个公共项目组?
  • @lowtechsun “旧”剪贴板是指“主要”和“次要”剪贴板,因为它们主要用于较旧的应用程序。您可能应该搜索 SO 以查看是否有另一个问题可以解释各种 Linux 剪贴板之间的差异,并询问是否没有。我也不知道您假设的用户受众会喜欢什么。
  • @Inerdia 是的,谢谢,我想出了PyGTKPyQt。只是不明白你的意思是“我怀疑强烈关心“主要”和“次要”剪贴板的人与使用自动 GUI 下载器的人之间存在重大重叠。我现在正在寻找。非常感谢到目前为止所有用户对这个问题的回复。谢谢!
【解决方案3】:

您可以使用 Qt 等 GUI 工具包来获得可移植的剪贴板 API。也就是说,仅仅为此使用整个 GUI 工具包可能有点矫枉过正。 (当然,除非你也打算用它来制作 GUI。)

也就是说,处理纯文本的剪贴板 API 应该相当简单,可以让您自己抽象。

例如,在 OS X 上,您可以使用 PyObjC(随 OS X 一起安装)来获取剪贴板的纯文本内容:

from AppKit import NSPasteboard
from LaunchServices import 
pb = NSPasteboard.generalPasteboard()
text = pb.stringForType_(kUTTypeUTF8PlainText)

CPU 架构

64 位操作系统上的 32 位本机应用程序将访问与 64 位操作系统相同的剪贴板。如果您需要同时支持操作系统的两种架构,并且不编写驱动程序,那么对于 Windows,可以提供 32 位二进制文​​件;对于 Linux,您可能必须同时使用这两个版本;对于 OS X,发布 64 位版本应该是相当安全的,自 2007 年中期以来的所有 Mac 都具有 64 位 CPU,并且自 Leopard 以来就支持操作系统。在 Linux 上,Python 脚本可能由分发包管理器中的 Python 安装执行,其位数将与系统匹配,因此您不必担心。

【讨论】:

  • 我正在学习 Python 的这本书使用了Tk-Interface。例如,我可以使用它吗?剪贴板上的数据只是 URL。我正在写一个下载器。它从用户输入中获取 URL(a) 并根据设定的模式对其进行更改。然后它会转到新创建的 URL(ab),例如 this one,并将所有内容复制到剪贴板,提取 URL,检查它们是否存在 404 错误,并将好的 URL 在列表中显示给用户。跨度>
  • 关于 32/64 位操作系统:因此,鉴于这个简短的基本概念,我认为只需要为所有操作系统编写 32 位版本,不是吗?我的意思是,例如在 64 位 Linux 上,32 位版本的脚本将运行,不是吗?在 Windows 和 Mac 上也一样,如果它们运行 63 位操作系统,它们仍然可以运行 32 位脚本,不是吗?现在很困惑.. 关于剪贴板:我想让用户输入 URL(a) 尽可能容易,所以不要复制和粘贴到脚本,只需从剪贴板读取而不是访问浏览器选项卡等,不是吗?
  • @lowtechsun:Tk 似乎有某种basic clipboard functionality。文档没有提到它是否与本机剪贴板集成;人们希望在这个时代它确实如此,但从历史上看,本地集成并不是 Tk 的强项。
  • @lowtechsun 仅当您要编写自己的本机代码与剪贴板交互时,32/64 部分才相关。如果您使用 Tk 或其他任何方式与操作系统交互,请让库担心。 Python 是一种脚本语言,你不需要关心 Python 代码中的架构。
  • @lowtechsun:如果你想与网络浏览器交互,你应该编写一个浏览器扩展。您可以通过让 Python 脚本公开 Web 服务并通过 AJAX 从扩展程序调用它来使其与在后台运行的 Python 进程对话。
【解决方案4】:

轮询并不稳健/可靠。

如果不将数据粘贴到缓冲区中进行检查,则无法确定数据是否已更改(无论如何在 Windows 上)。这需要打开剪贴板。如果您循环执行此操作,您将与其他应用程序发生冲突。即用户将另一个项目复制到剪贴板上的应用程序。这将因“无法打开剪贴板”或“内存不足”错误而爆炸。这种方法不会可靠/稳健地工作。您需要在各种平台中使用适当的剪贴板监控 API。

【讨论】:

  • 感谢 Chris 提供的信息丰富的回复。因此,假设我有一个循环,可以访问剪贴板并检查内容,如果内容更改,则将新内容复制到我分配的变量中,如果相同,请保持原样,在 Windows 上不起作用?我想要使​​用剪贴板的唯一原因是用户不必手动复制和粘贴 URL。如果有更优雅的方法,比如用鼠标,只需将 URL 作为用户输入复制并粘贴到脚本中,请告诉我。看看你的网站,你似乎真的很了解剪贴板。THX
【解决方案5】:

我怀疑也可以通过以下链接使用 pythonnet + TextCopy 库以平台中立的方式复制剪贴板:

http://pythonnet.github.io/

https://stackoverflow.com/a/51912933/2338477

(在此处查看类似问题:Quick and easy file dialog in Python?

但我自己还没有尝试过,可能还需要尝试运行什么样的命令以及从哪个控制台运行。让我知道是否有人会尝试这个,我会在这里更新更多细节。

【讨论】:

    猜你喜欢
    • 2015-04-02
    • 2022-12-22
    • 1970-01-01
    • 2011-04-19
    • 2012-06-24
    • 2012-06-19
    • 2019-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多