Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字符串复制到剪贴板?_Python_Windows_Interop_Clipboard - Fatal编程技术网

Python 如何将字符串复制到剪贴板?

Python 如何将字符串复制到剪贴板?,python,windows,interop,clipboard,Python,Windows,Interop,Clipboard,我正在尝试创建一个基本的Windows应用程序,它从用户输入中生成一个字符串,然后将其添加到剪贴板。如何使用Python将字符串复制到剪贴板?看起来您需要将win32clipboard添加到站点包中。它是的一部分,您还可以使用ctypes进入Windows API,避免使用大量的pywin32软件包。这就是我所使用的(请原谅我的拙劣风格,但我的想法是存在的): 事实上,pywin32和ctypes对于这个简单的任务来说似乎是一种过度使用Tkinter是一个跨平台的GUI框架,默认情况下随Pyth

我正在尝试创建一个基本的Windows应用程序,它从用户输入中生成一个字符串,然后将其添加到剪贴板。如何使用Python将字符串复制到剪贴板?

看起来您需要将win32clipboard添加到站点包中。它是

的一部分,您还可以使用ctypes进入Windows API,避免使用大量的pywin32软件包。这就是我所使用的(请原谅我的拙劣风格,但我的想法是存在的):


事实上,
pywin32
ctypes
对于这个简单的任务来说似乎是一种过度使用
Tkinter
是一个跨平台的GUI框架,默认情况下随Python提供,并具有剪贴板访问方法和其他很酷的东西

如果您只需要将一些文本放入系统剪贴板,则可以这样做:

from Tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('i can has clipboardz?')
r.update() # now it stays on the clipboard after the window is closed
r.destroy()
仅此而已,无需与特定于平台的第三方库混在一起


如果您使用的是Python 3,请将
TKinter
替换为
TKinter

我没有解决方案,只是一种变通方法

Windows Vista以后版本有一个名为
clip
的内置命令,它从命令行获取命令输出并将其放入剪贴板。例如,
ipconfig | clip

因此,我使用
os
模块创建了一个函数,它使用内置的Windows解决方案获取一个字符串并将其添加到剪贴板

import os
def addToClipBoard(text):
    command = 'echo ' + text.strip() + '| clip'
    os.system(command)

# Example
addToClipBoard('penny lane')

# Penny Lane is now in your ears, eyes, and clipboard.
然而,正如前面在评论中所指出的,这种方法的一个缺点是,
echo
命令会自动在文本末尾添加一个换行符。要避免这种情况,可以使用修改后的命令版本:

def addToClipBoard(text):
    command = 'echo | set /p nul=' + text.strip() + '| clip'
    os.system(command)

如果您使用的是WindowsXP,它将按照中的步骤运行。

小部件还具有名为
.clipboard\u get()
的方法,该方法返回剪贴板的内容(除非根据剪贴板中的数据类型发生某种错误)

此错误报告中提到了
clipboard\u get()
方法:


奇怪的是,我通常参考的常见(但非官方)在线TkInter文档资源中没有提到这种方法。

您可以使用-跨平台剪贴板模块。或者-类似的模块,除了需要win32 Python模块才能在Windows上工作。

由于某种原因,我一直无法让Tk解决方案为我工作。更容易操作,但是格式与我的风格相反,它不适用于Unicode。这是一个修改过的版本

from Tkinter import Tk
clip = Tk()
import ctypes

OpenClipboard = ctypes.windll.user32.OpenClipboard
EmptyClipboard = ctypes.windll.user32.EmptyClipboard
GetClipboardData = ctypes.windll.user32.GetClipboardData
SetClipboardData = ctypes.windll.user32.SetClipboardData
CloseClipboard = ctypes.windll.user32.CloseClipboard
CF_UNICODETEXT = 13

GlobalAlloc = ctypes.windll.kernel32.GlobalAlloc
GlobalLock = ctypes.windll.kernel32.GlobalLock
GlobalUnlock = ctypes.windll.kernel32.GlobalUnlock
GlobalSize = ctypes.windll.kernel32.GlobalSize
GMEM_MOVEABLE = 0x0002
GMEM_ZEROINIT = 0x0040

unicode_type = type(u'')

def get():
    text = None
    OpenClipboard(None)
    handle = GetClipboardData(CF_UNICODETEXT)
    pcontents = GlobalLock(handle)
    size = GlobalSize(handle)
    if pcontents and size:
        raw_data = ctypes.create_string_buffer(size)
        ctypes.memmove(raw_data, pcontents, size)
        text = raw_data.raw.decode('utf-16le').rstrip(u'\0')
    GlobalUnlock(handle)
    CloseClipboard()
    return text

def put(s):
    if not isinstance(s, unicode_type):
        s = s.decode('mbcs')
    data = s.encode('utf-16le')
    OpenClipboard(None)
    EmptyClipboard()
    handle = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, len(data) + 2)
    pcontents = GlobalLock(handle)
    ctypes.memmove(pcontents, data, len(data))
    GlobalUnlock(handle)
    SetClipboardData(CF_UNICODETEXT, handle)
    CloseClipboard()

paste = get
copy = put

自从这个答案首次创建以来,上面的内容已经发生了变化,以便更好地处理扩展的Unicode字符和Python 3。它已经在Python 2.7和3.5中进行了测试,甚至可以与表情符号一起使用,例如
\U0001f601(我尝试过各种解决方案,但这是通过的最简单的解决方案:

#编码=utf-8
导入win32clipboard#http://sourceforge.net/projects/pywin32/
def副本(文本):
win32clipboard.OpenClipboard()
win32clipboard.EmptyClipboard()
Win32 Clipboard.SetClipboardText(文本,Win32 Clipboard.CF_UNICODETEXT)
win32clipboard.CloseClipboard()
def paste():
win32clipboard.OpenClipboard()
data=win32clipboard.GetClipboardData(win32clipboard.CF\u unicodext)
win32clipboard.CloseClipboard()
返回数据
如果名称=“\uuuuu main\uuuuuuuu”:

text=“Testing\n“剪贴板”:复制剪贴板的代码段:

import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
def setText(text):
    Clipboard.SetText(text)

def getText():
    return Clipboard.GetText()
command = 'echo content |clip'
subprocess.check_call(command, shell=True)
在名为(clipboard.py)的模块中创建包装Python代码:

然后将上述模块导入到代码中

import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)

我必须赞扬这篇博文。

您可以使用优秀的pandas,它具有内置的剪贴板支持,但您需要传递数据帧

name = input('What is your name? ')
print('Hello %s' % (name) )

我认为有一个更简单的解决办法

pip install pyperclip
然后在命令行中运行程序

python greeter.py | clip


这将通过管道将文件输出到剪贴板

这是雾化器的改进答案

注意2调用
update()
200ms
之间的延迟。它们保护由于剪贴板状态不稳定而冻结的应用程序:

command = 'echo content |clip'
subprocess.check_call(command, shell=True)
从Tkinter导入Tk
导入时间
r=Tk()
r、 撤回
r、 剪贴板_clear()
r、 剪贴板\u追加('some string')
r、 更新()
时间。睡眠(.2)
r、 更新()
r、 销毁
最简单的方法是在python 2和3中使用.Works

要安装此库,请使用:

import pyperclip

pyperclip.copy("your string")
用法示例:

clipboard_content = pyperclip.paste()
如果要获取剪贴板的内容,请执行以下操作:

command = 'echo content |clip'
subprocess.check_call(command, shell=True)
您可以尝试以下方法:

import subprocess
import os

def cp2clip(clist):

    #create a temporary file
    fi=open("thisTextfileShouldNotExist.txt","w")

    #write in the text file the way you want your data to be
    for m in clist:
        fi.write(m+"\n")

    #close the file
    fi.close()

    #send "clip < file" to the shell
    cmd="clip < thisTextfileShouldNotExist.txt"
    w = subprocess.check_call(cmd,shell=True)

    #delete the temporary text file
    os.remove("thisTextfileShouldNotExist.txt")

    return w

我在这里分享的代码片段利用了格式化文本文件的功能:如果要将复杂的输出复制到剪贴板,该怎么办

在任何文本编辑器中按Ctrl+V组合键:

import clipboard
您可以使用模块。它简单易用。适用于MacWindows、&Linux
注意:它是
pyperclip

安装后,将其导入:

clipboard.copy("This is copied")
然后你可以这样复制:

clipboard.paste()
您还可以粘贴复制的文本:

import ctypes
import ctypes.wintypes as w

CF_UNICODETEXT = 13

u32 = ctypes.WinDLL('user32')
k32 = ctypes.WinDLL('kernel32')

OpenClipboard = u32.OpenClipboard
OpenClipboard.argtypes = w.HWND,
OpenClipboard.restype = w.BOOL

GetClipboardData = u32.GetClipboardData
GetClipboardData.argtypes = w.UINT,
GetClipboardData.restype = w.HANDLE

EmptyClipboard = u32.EmptyClipboard
EmptyClipboard.restype = w.BOOL

SetClipboardData = u32.SetClipboardData
SetClipboardData.argtypes = w.UINT, w.HANDLE,
SetClipboardData.restype = w.HANDLE

CloseClipboard = u32.CloseClipboard
CloseClipboard.argtypes = None
CloseClipboard.restype = w.BOOL

GHND = 0x0042

GlobalAlloc = k32.GlobalAlloc
GlobalAlloc.argtypes = w.UINT, w.ctypes.c_size_t,
GlobalAlloc.restype = w.HGLOBAL

GlobalLock = k32.GlobalLock
GlobalLock.argtypes = w.HGLOBAL,
GlobalLock.restype = w.LPVOID

GlobalUnlock = k32.GlobalUnlock
GlobalUnlock.argtypes = w.HGLOBAL,
GlobalUnlock.restype = w.BOOL

GlobalSize = k32.GlobalSize
GlobalSize.argtypes = w.HGLOBAL,
GlobalSize.restype = w.ctypes.c_size_t

unicode_type = type(u'')

def get():
    text = None
    OpenClipboard(None)
    handle = GetClipboardData(CF_UNICODETEXT)
    pcontents = GlobalLock(handle)
    size = GlobalSize(handle)
    if pcontents and size:
        raw_data = ctypes.create_string_buffer(size)
        ctypes.memmove(raw_data, pcontents, size)
        text = raw_data.raw.decode('utf-16le').rstrip(u'\0')
    GlobalUnlock(handle)
    CloseClipboard()
    return text

def put(s):
    if not isinstance(s, unicode_type):
        s = s.decode('mbcs')
    data = s.encode('utf-16le')
    OpenClipboard(None)
    EmptyClipboard()
    handle = GlobalAlloc(GHND, len(data) + 2)
    pcontents = GlobalLock(handle)
    ctypes.memmove(pcontents, data, len(data))
    GlobalUnlock(handle)
    SetClipboardData(CF_UNICODETEXT, handle)
    CloseClipboard()

#Test run
paste = get
copy = put
copy("Hello World!")
print(paste())
除了使用ctypes外: 这不适用于(所有?)x64系统,因为句柄似乎被截断为int大小。 显式定义参数和返回值有助于克服此问题

from pandas.io import clipboard
clipboard.copy("test")

这是我发现的最简单、最可靠的方法,如果你可以依赖熊猫。但是我不认为这是熊猫API的正式部分,因此它可能会在未来的更新中中断。它从0.25.3开始工作

import clipboard as cp
cp.copy("abc")

使用python的剪贴板库

import subprocess
subprocess.run('copy_keyword', universal_newlines=True, input='New Clipboard Value You can use winclip32 module!
install:

pip install winclip32

剪贴板现在包含“abc”。粘贴愉快!

并非所有答案都适用于我的各种python配置,因此此解决方案仅使用子流程模块。但是,对于Mac而言,
copy\u关键字必须是
pbcopy
,对于Windows而言必须是
clip

import winclip32
winclip32.set_clipboard_data(winclip32.UNICODE_STD_TEXT, "some text")
导入子流程

subprocess.run('copy_keyword',universal_newlines=True,input='New Clipboard Value您可以使用winclip32模块! 安装:

复制:

import pyperclip
pyperclip.copy('Hello World!')
要获得:

pyperclip.paste() # This returns the copied text of type <class 'str'>
有关更多信息:

使用
pyperclip
模块

import winclip32 winclip32.set_clipboard_data(winclip32.UNICODE_STD_TEXT, "some text")

import winclip32
print(winclip32.get_clipboard_data(winclip32.UNICODE_STD_TEXT))
import pyperclip
pyperclip.copy('Hello World!')
pyperclip.paste() # This returns the copied text of type <class 'str'>