使用 Python 实现复制粘贴的功能

简介: 使用 Python 实现复制粘贴的功能

楔子



pandas 里面有一个 pd.read_clipboard 函数,可以根据你复制的内容生成DataFrame。是的,就是我们平时选中,然后 Ctrl+C 时拷贝的内容。所以比较神奇,那么 pandas 到底是怎么做到的,它是怎么读出我们使用 Ctrl +C 复制的内容呢。

看了一下源码,不同的操作系统使用的复制方式不同,Windows 比较复杂,方法是使用了ctypes,然后调用了操作系统的一个动态库实现的;而 macOS 和 Linux 比较简单,调用的是内置的命令。

下面我们来看看如何在这三个系统上实现复制粘贴的功能。


Windows 上的复制粘贴



们说 Windows 是使用 ctypes 调用动态库实现的,比较麻烦。但是我们知道 Python 有一个 pywin32 模块,对于 Windows 操作系统提供的接口进行了封装。所以在 Windows 上我们会使用 pywin32 来实现复制粘贴功能。

该模块直接通过 pip install pywin32 安装即可。

import win32clipboard as wcb
import win32con as wc
# 打开复制粘贴板
wcb.OpenClipboard()
# 我们之前可能已经 Ctrl + C 了
# 这里是清空目前 Ctrl + C 复制的内容
# 但显然没有这一步也无所谓,因为第二次复制会覆盖第一次复制的内容
wcb.EmptyClipboard()
# 将内容写入复制粘贴板,第一个参数是 win32con.CF_TEXT
# 第二个参数是我们要复制的内容,编码的时候指定为 "gbk"
wcb.SetClipboardData(wc.CF_TEXT, "古明地觉".encode("gbk"))
# 关闭复制粘贴板
wcb.CloseClipboard()

然后我们 Ctrl+V 粘贴就会得到 "古明地觉" 这个字符串,另外编码的时候要使用 gbk,因为我当前操作系统默认编码使用的是 gbk,所以会对我们输入的字节使用 gbk 解码。因此如果使用 utf-8 编码的话,那么粘贴之后得到的就会是乱码。当然具体编码根据你当前的机器决定。

复制我们实现了,下面来看看怎么实现粘贴。

import win32clipboard as wcb
import win32con as wc
wcb.OpenClipboard()
# 获取粘贴板内容,既然是获取,那么只需要一个参数即可
# 会返回已经使用 Ctrl + C 复制的内容
data = wcb.GetClipboardData(wc.CF_TEXT)
# 关闭复制粘贴板
wcb.CloseClipboard()
# 然后随便 Ctrl+C 拷贝一段内容
# 下面就会将拷贝的内容打印出来
print(data.decode("gbk"))

还是很简单的,我们上面使用的模块是 win32 系列,所以它只适用于 Windows 系统。那如果我想在 Linux 和 macOS 中实现怎么办呢?也很简单,事实上,这两个系统实现起来反而会更简单,因为自带了相关的命令。


macOS 上的复制粘贴



macOS 自带了相关命令,我们只需要通过 subprocess 模块去调用即可,举个例子:

非常简单,那么代码要如何实现呢?

import subprocess
# 实现拷贝
def copy(text):
    p = subprocess.Popen(["pbcopy", "w"],
                         stdin=subprocess.PIPE,
                         close_fds=True)
    # 将内容拷贝起来,注意 macOS 的编码默认是 utf-8
    p.communicate(input=text.encode("utf-8"))
# 实现粘贴
def paste():
    p = subprocess.Popen(["pbpaste", "r"],
                         stdout=subprocess.PIPE,
                         close_fds=True)
    stdout, stderr = p.communicate()
    # 返回粘贴内容
    return stdout.decode("utf-8")
copy("古明地觉的编程教室")
print(paste())  # 古明地觉的编程教室

以上代码在 macOS 上执行,由于自带了复制粘贴相关的命令,操作起来就比 Windows 方便多了。


Linux 上的复制粘贴



Linux 也提供了复制粘贴的命令,叫 xclip,但这个命令不是自带的,我们需要使用 yum 安装。

import subprocess
# 实现拷贝
def copy(text):
    p = subprocess.Popen(
        ["xclip", "-selection", "c"], 
        stdin=subprocess.PIPE, close_fds=True
    )
    p.communicate(input=text.encode("utf-8"))
# 实现粘贴   
def paste():
    p = subprocess.Popen(
        ["xclip", "-selection", "c", "-o"], 
        stdout=subprocess.PIPE, close_fds=True
    )
    stdout, stderr = p.communicate()
    return stdout.decode("utf-8")

其实在 Linux 通过命令实复制粘贴没什么因为我们都是通过 SSH 远程连接到公司的服务器,这种情况下 xclip 是不生效的。

当然,感觉这个功能也没多大用,当做兴趣了解一下就行。


pyperclip 实现复制粘贴



最后我们再来介绍一个模块,叫 pyperclip,它对不同的操作系统的复制粘贴功能进行了封装,可以简化我们的操作。举个例子:

import pyperclip
# 复制
pyperclip.copy("哼哼")
# 粘贴
print(pyperclip.paste())  # 哼哼

还是很方便的,以后就可以使用这个模块,自动帮我们屏蔽了操作系统间的差异。另外,这个模块只支持复制文本。

var first_sceen__time = (+new Date()); if ("" == 1 && document.getElementById('js_content')) { document.getElementById('js_content').addEventListener("selectstart",function(e){ e.preventDefault(); }); }

相关文章
|
1月前
|
前端开发 JavaScript UED
探索Python Django中的WebSocket集成:为前后端分离应用添加实时通信功能
通过在Django项目中集成Channels和WebSocket,我们能够为前后端分离的应用添加实时通信功能,实现诸如在线聊天、实时数据更新等交互式场景。这不仅增强了应用的功能性,也提升了用户体验。随着实时Web应用的日益普及,掌握Django Channels和WebSocket的集成将为开发者开启新的可能性,推动Web应用的发展迈向更高层次的实时性和交互性。
78 1
|
1月前
|
计算机视觉 Python
Python实用记录(一):如何将不同类型视频按关键帧提取并保存图片,实现图片裁剪功能
这篇文章介绍了如何使用Python和OpenCV库从不同格式的视频文件中按关键帧提取图片,并展示了图片裁剪的方法。
76 0
|
11天前
|
缓存 监控 测试技术
Python中的装饰器:功能扩展与代码复用的利器###
本文深入探讨了Python中装饰器的概念、实现机制及其在实际开发中的应用价值。通过生动的实例和详尽的解释,文章展示了装饰器如何增强函数功能、提升代码可读性和维护性,并鼓励读者在项目中灵活运用这一强大的语言特性。 ###
|
15天前
|
缓存 开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第35天】装饰器在Python中是一种强大的工具,它允许开发者在不修改原有函数代码的情况下增加额外的功能。本文旨在通过简明的语言和实际的编码示例,带领读者理解装饰器的概念、用法及其在实际编程场景中的应用,从而提升代码的可读性和复用性。
|
20天前
|
设计模式 缓存 测试技术
Python中的装饰器:功能增强与代码复用的艺术####
本文将深入探讨Python中装饰器的概念、用途及实现方式,通过实例演示其如何为函数或方法添加新功能而不影响原有代码结构,从而提升代码的可读性和可维护性。我们将从基础定义出发,逐步深入到高级应用,揭示装饰器在提高代码复用性方面的强大能力。 ####
|
21天前
|
缓存 测试技术 数据安全/隐私保护
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第29天】本文通过深入浅出的方式,探讨了Python装饰器的概念、使用场景和实现方法。文章不仅介绍了装饰器的基本知识,还通过实例展示了如何利用装饰器优化代码结构,提高代码的可读性和重用性。适合初学者和有一定经验的开发者阅读,旨在帮助读者更好地理解和应用装饰器,提升编程效率。
|
28天前
|
开发者 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第22天】在Python的世界里,装饰器是一个强大的工具,它能够让我们以简洁的方式修改函数的行为,增加额外的功能而不需要重写原有代码。本文将带你了解装饰器的基本概念,并通过实例展示如何一步步构建自己的装饰器,从而让你的代码更加高效、易于维护。
|
29天前
|
开发框架 Python
探索Python中的装饰器:简化代码,增强功能
【10月更文挑战第20天】在编程的海洋中,简洁与强大是航行的双桨。Python的装饰器,这一高级特性,恰似海风助力,让代码更优雅、功能更强大。本文将带你领略装饰器的奥秘,从基础概念到实际应用,一步步深入其内涵与意义。
|
1月前
|
云计算 Python
用python给你写个简单的计算器功能网页啊
这张图片展示了阿里巴巴集团的组织架构图,涵盖了核心电商、云计算、数字媒体与娱乐、创新业务等主要板块,以及各板块下的具体业务单元和部门。
|
1月前
|
设计模式 开发者 Python
Python中的装饰器:简化代码与增强功能
【10月更文挑战第9天】在编程的世界里,效率和可读性是衡量代码质量的两大关键指标。Python语言以其简洁明了的语法赢得了无数开发者的青睐,而装饰器则是其独特魅力之一。本文将深入探讨装饰器的工作原理、使用方法以及如何通过自定义装饰器来提升代码的重用性和可维护性,让读者能够更加高效地编写出既优雅又功能强大的代码。
下一篇
无影云桌面