如何使用 python 或 CL 将文件复制到剪贴板,然后使用 STRG+V 粘贴它?

2024-04-23

我正在尝试将文件复制(使用 python 或 CL 命令,然后可以使用 python 调用)到剪贴板,以便稍后使用 STRG+V 粘贴它。据我了解,文件不会“移动”到剪贴板中,而是剪贴板保存路径和告诉操作系统“这是一个文件”的参数/标志。我对 Linux 特定的答案很满意,但通用的答案将是最重要的。

pyperclip

不是一个解决方案,因为它不允许复制文件,只能复制字符串。

xclip

不是一个解决方案,因为它只复制文本

xclip-复制文件

不是一个解决方案,因为它只复制到X剪贴板,而不是剪贴板。虽然 xclip 提供了选项-selection clipboard(但仅复制文本),xclip-copyfile没有这样的选项。

使用查找

find ${PWD} -name "*.pdf"| xclip -i -selection clipboard -t text/uri-list

是此处描述的命令:https://askubuntu.com/questions/210413/what-is-the-command-line-equivalent-of-copying-a-file-to-clipboard#answer-210428 https://askubuntu.com/questions/210413/what-is-the-command-line-equivalent-of-copying-a-file-to-clipboard#answer-210428

但我无法用它复制文件,因此假设它不适用于所有文件。


配置

剪贴板是窗口管理的一部分,而不是 Linux 操作系统本身的一部分。具有不同分布的不同配置表现不同,因此需要不同的变体。 与此同时,Wayland 正逐渐走上逐步取代 X 的道路,这意味着需要考虑三种配置:

  • 仅限韦兰
  • Wayland 与 XWayland 一起(兼容非适配的 X 软件)
  • X

发送剪贴板内容

当保存到剪贴板时,系统首先仅通知接收者数据可用于剪贴板。仅根据请求发送实际数据。因此,在数据传输之前,不得终止将内容发送到剪贴板的程序。根据环境/配置,程序终止后剪贴板的内容也可能被删除。

那么如何xclip问题中已经提到的程序有效吗?似乎被调用后立即终止。但仔细检查后发现并非如此,因为它执行了分叉,因此它仍然存在于后台(通过查看源代码或命令可以轻松验证)ps).

Format

此外,不同的环境以不同的方式需要内容。例如,GNOME 要求使用特殊目标复制文件列表x-special/gnome-copied-files以及内容的特殊格式,例如copy\nfile:///etc/group以便 GNOME 文件管理器 Nautilus 正确执行复制操作。

另一方面,在 KDE 下,只有一个包含目标的 URI 列表text/uri-list.

确定环境

以下示例程序适用于 Linuxmint 20.2 Cinnamon、带有 Gnome 的 Ubuntu 22.04 和带有 KDE 的 Kubuntu 22.04。其他发行版/配置可能需要一些定制。在这里,建议简单地在适当的文件管理器中复制文件,然后使用程序查看剪贴板内容,然后对脚本进行适当的调整。

基于环境变量XDG_CURRENT_DESKTOP and WAYLAND_DISPLAY以下程序尝试确定环境。

如果是韦兰的话wl-copy被使用,否则xclip用来。目标和内容格式会相应调整。和subprocess.Popen该工具启动并将内容发送到stdin该工具的。

一旦完成,程序就会退出。两个都wl-copy and xclip然后创建一个分叉,确保数据存在于剪贴板中。

import os
import subprocess
import sys
from pathlib import Path

gnome_desktops = ['X-Cinnamon', 'XFCE']


def is_gnome(desktop):
    if desktop.endswith("GNOME") or desktop in gnome_desktops:
        return True
    return False


def target():
    current_desktop = os.environ['XDG_CURRENT_DESKTOP']
    if is_gnome(current_desktop):
        return 'x-special/gnome-copied-files'
    elif current_desktop == 'KDE':
        return 'text/uri-list'
    else:
        sys.exit(f'unsupported desktop {current_desktop}')


def base_copy_cmd():
    if 'WAYLAND_DISPLAY' in os.environ:
        return 'wl-copy'
    return 'xclip -i -selection clipboard'


def copy_clipboard_cmd():
    return f"{base_copy_cmd()} -t '{target()}'"


def content(files_to_copy):
    uris = '\n'.join([Path(f).as_uri() for f in files_to_copy])
    current_desktop = os.environ['XDG_CURRENT_DESKTOP']
    if is_gnome(current_desktop):
        return f"copy\n{uris}".encode("utf-8")
    return uris.encode("utf-8")


def copy_to_clipboard(files_to_copy):
    copy_process = subprocess.Popen(copy_clipboard_cmd(), shell=True, stdin=subprocess.PIPE)
    copy_process.stdin.write(content(files_to_copy))
    copy_process.stdin.close()
    copy_process.wait()


if __name__ == '__main__':
    files = ['/etc/hosts', '/etc/group']
    copy_to_clipboard(files)

如上所述,对于其他环境,只需在本机文件管理器中复制文件,然后检查当前剪贴板内容并对脚本进行适当的调整。

根据环境的不同,xclip or wl-copy(安装包wl-clipboard与您的包管理器)必须在那里。有关详细信息wl-copy可以在这里找到:https://github.com/bugaevc/wl-clipboard https://github.com/bugaevc/wl-clipboard.

检查剪贴板

最后,为了能够转储剪贴板的当前内容,这里有一个小脚本可以做到这一点。因此可以看到其他程序(例如本机文件管理器)将哪些内容放入剪贴板。通常许多程序将同一数据的多个不同表示目标放入剪贴板。

import gi

gi.require_version("Gtk", "3.0")
from gi.repository import Gtk, Gdk


def on_activate(app):
    win = Gtk.ApplicationWindow(application=app)
    win.set_title("GTK Clipboard Util")
    win.set_default_size(256, 192)
    btn = Gtk.Button(label="Dump Clipboard")
    btn.connect('clicked', dump)
    box = Gtk.VBox()
    win.add(box)
    box.add(btn)
    win.show_all()


def dump(button):
    cb_targets = []
    counter = 0

    def print_content(clipboard, data):
        print(data.get_data())
        print()
        print_next_target_and_content(clipboard)

    def print_next_target_and_content(clipboard):
        nonlocal counter
        if counter < len(cb_targets):
            target = cb_targets[counter]
            print(target)
            clipboard.request_contents(target, print_content)
            counter += 1

    def get_targets(clipboard, targets, n_targets):
        nonlocal counter
        nonlocal cb_targets
        counter = 0
        cb_targets = targets
        print_next_target_and_content(clipboard)

    gtk_clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
    gtk_clipboard.request_targets(get_targets)


if __name__ == '__main__':
    app = Gtk.Application(application_id='com.software7.clipboard.formats')
    app.connect('activate', on_activate)
    app.run(None)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 python 或 CL 将文件复制到剪贴板,然后使用 STRG+V 粘贴它? 的相关文章

  • 在 Kivy 应用程序中获取文本输入值

    Python Kivy 新手尝试构建一个测试应用程序 其中包含输入框 确定按钮和单击确定按钮时应更改文本的标签 但我得到了 NameError 全局名称 txt1 未定义 我究竟做错了什么 import Kivy import kivy i
  • Bokeh 相当于 matplotlib 子图

    我正在寻找一种方法来创建包含多个子图的绘图 例如 fig ax0 ax1 plt subplots nrows 2 sharex True 可以在 matplotlib 中完成 然后可以通过以下方式解决ax0 and ax1 有没有办法在
  • Python - 重写 print()

    我正在使用 mod wsgi 想知道是否可以覆盖 print 命令 因为它没用 这样做是行不通的 print myPrintFunction 因为这是一个语法错误 Print 不是 Python 2 x 中的函数 因此这不能直接实现 但是
  • 在 Spark-submit 上的 _find_and_load 中获取文件“”,第 991 行

    我目前使用的是Python 3 7 9 spark spark 2 4 6 bin hadoop2 6 在这个项目 venv 中 我的设置为 kafka python 2 0 2 pip 21 2 4 py4j 0 10 9 pyspark
  • Python 有哪些 SOAP 客户端库,它们的文档在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Pandas 无法读取使用 h5py 创建的 hdf5 文件

    当我尝试读取使用 h5py 创建的 HDF5 格式文件时 出现 pandas 错误 我想知道我是否只是做错了什么 import h5py import numpy as np import pandas as pd h5 file h5py
  • 无法写入文本文件

    我正在运行一些测试并需要写入文件 当我运行测试时open file r 不写入文件 测试脚本如下 class GetDetailsIP TestGet def runTest self self category PTZ try This
  • 如何开始使用“scipy”

    我之前安装过 Python 3 4 2 和 3 5 2 在这两种情况下 我都可以在 Idle 中涉足编写和测试代码 这给了我两个窗口 一个用于代码的 运行 窗口 一个用于交互和测试的 Shell 窗口 输出 抱歉 不确定术语是否正确 现在我
  • 从汇编程序获取命令行参数

    通读 专业汇编语言书籍 似乎它提供了用于读取命令行参数的错误代码 我纠正了一点 现在它从段错误变成了读取参数计数 然后是段错误 这是完整的代码 data output1 asciz There are d params n output2
  • Pandas 数据框列总和并收集结果

    给定以下数据框 import pandas as pd p1 name willy age 11 interest Lego p2 name willy age 11 interest games p3 name zoe age 9 int
  • 如何在 Django 中创建多选框?

    我正在尝试创建多选框字段来自姜戈选择 2 https github com applegrew django select2库如下图所示 我使用了下一个代码 但它返回简单的选择多个小部件 我想我忘了补充一些东西 我的错误在哪里 有人可以告诉
  • PySide2/QML 填充 Gridview 模型/委托并为其设置动画

    我是 QML 的新手 正在寻求以下几点帮助 如何基于 TextField 输入 如 Regex 通过 PySide2 过滤 Gridview 模型中的 QAbstractListModel 数据 标题 如何在鼠标悬停时为 Gridview
  • C中的内存使用问题

    请帮忙 操作系统 Linux 其中 sleep 1000 中 此时 top 显示Linux任务 给我写了7 7 MEM使用 valgrind 未发现内存泄漏 我明白 写得正确 所有 malloc 结果都是 NULL 但是为什么这次 睡眠 我
  • 从命名管道读取

    我必须实现一个 打印服务器 我有 1 个客户端文件和 1 个服务器文件 include
  • 随机数生成器每次仅返回一个数字

    Python 是否有一个随机数生成器 每次只返回一个随机整数next 函数被调用 数字不应该重复并且生成器应返回区间内的随机整数 1 1 000 000 这是独一无二的 我需要生成超过一百万个不同的数字 这听起来好像非常消耗内存 以防所有数
  • 是否可以使用 Google BERT 来计算两个文本文档之间的相似度?

    是否可以使用 Google BERT 来计算两个文本文档之间的相似度 据我了解 BERT 的输入应该是有限大小的句子 一些作品使用 BERT 来计算句子的相似度 例如 https github com AndriyMulyar semant
  • 设置restrict_xpaths设置后出现UnicodeEncodeError

    我是 python 和 scrapy 的新手 将restrict xpaths 设置设置为 table class lista 后 我收到了以下回溯 奇怪的是 通过使用其他 xpath 规则 爬虫可以正常工作 Traceback most
  • Python 装饰器只是语法糖? [复制]

    这个问题在这里已经有答案了 可能的重复 了解 Python 装饰器 https stackoverflow com questions 739654 understanding python decorators 我对使用 Python 装
  • 在 python 中使用 org.mpris.mediaplayer2.player PlaybackStatus 属性

    The 规格页 http specifications freedesktop org mpris spec latest Player Interface html summary对于这个特定的接口说 PlaybackStatus s P
  • Django migrate:不创建表

    经过一些错误后 我删除了数据库 删除了所有迁移文件 我留下了init py 现在 当我跑步时 python migrate py makemigrations It creates migrations correctly python m

随机推荐