Làm cách nào để sao chép chuỗi vào bảng tạm trên Windows bằng Python?


193

Tôi đang cố gắng tạo một ứng dụng Windows cơ bản xây dựng một chuỗi từ đầu vào của người dùng và sau đó thêm nó vào bảng tạm. Làm cách nào để sao chép chuỗi vào bảng tạm bằng Python?


4
Liên quan đến câu hỏi này .
glglgl

jaraco.clipboard thực hiện điều đó (quá): clipboard.copy (biến)
JinSnow

Đồng thời xem câu trả lời của tôi cho một câu hỏi liên quan về việc sao chép vào bảng tạm bằng Tkinter mà không hiển thị cửa sổ. Nó bao gồm một hàm Python thay thế / trả về văn bản clipboard bằng Tkinter.
Edward

Câu trả lời:


285

Trên thực tế, pywin32ctypesdường như là một quá mức cho nhiệm vụ đơn giản này. Tkinterlà một khung GUI đa nền tảng, đi kèm với Python theo mặc định và có các phương thức truy cập clipboard cùng với các nội dung thú vị khác.

Nếu tất cả những gì bạn cần là đặt một số văn bản vào bảng tạm hệ thống, việc này sẽ thực hiện:

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()

Và đó là tất cả, không cần phải loay hoay với các thư viện bên thứ ba dành riêng cho nền tảng.

Nếu bạn đang sử dụng Python 3, hãy thay thế TKinterbằng tkinter.


55
Nhận nội dung của bảng tạm: result = r.selection_get (select = "CLIPBOARD")
MJ

34
@SurDin Tkinter được đổi tên thành tkinter trong python 3, vì vậy nó phụ thuộc vào phiên bản bạn đang sử dụng.
thật Abe

24
tất cả các ứng dụng của tôi không phản hồi sau khi dán nội dung của bảng tạm với chức năng này, thật kỳ lạ, kết quả hoạt động tốt.
Bartlomiej Lewandowski

14
Nó hoạt động nếu tôi không gọi r.destroy(). Khi tôi gọi như vậy, bảng tạm sẽ trống và nhấn Ctrl-V có thể khiến ứng dụng đích bị đóng băng. (HĐH: Windows 7 x64)
netvope

8
Đối với tôi điều này không hoạt động với python 3.4, nhưng nó hoạt động với python 2.7 (vâng, với tkinter thay vì Tkinter)
Matty

78

Tôi không có giải pháp, chỉ là cách giải quyết.

Windows Vista trở đi có một lệnh inbuilt được gọi là cliplấy đầu ra của lệnh từ dòng lệnh và đặt nó vào bảng tạm. Ví dụ , ipconfig | clip.

Vì vậy, tôi đã tạo một hàm với osmô-đun lấy một chuỗi và thêm nó vào bảng tạm bằng cách sử dụng giải pháp Windows sẵn có.

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.

Tuy nhiên, như đã lưu ý trong các bình luận, một nhược điểm của phương pháp này là echolệnh tự động thêm một dòng mới vào cuối văn bản của bạn. Để tránh điều này, bạn có thể sử dụng một phiên bản sửa đổi của lệnh:

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

Nếu bạn đang sử dụng Windows XP, nó sẽ hoạt động theo các bước trong Sao chép và dán từ dấu nhắc lệnh của Windows XP Pro thẳng vào Clipboard .


20
Điều gì xảy ra nếu textcó chứa | calc.exe ?
Willi Ballenthin

2
@WilliBallenthin thì bạn cần phải bọc nó trong dấu ngoặc kép. Nhưng nếu nó CONTAIN báo giá kép thì sao? Sau đó, bạn cần phải tăng gấp đôi dấu ngoặc kép. text with " quotes and | pipetrở thành "text with "" quotes and | pipe" Mặc dù điều này có thể có vấn đề trên các hệ thống có cửa sổ cũ hơn 95.
ColBeseder

5
Chức năng cực kỳ không an toàn ... Nội dung được gửi vào bảng tạm của bạn giờ là một vectơ nhập cảnh và do đó làm tăng bề mặt tấn công của bạn.
Phil L.

2
Tôi cũng cần hỗ trợ cho các dòng mới, vì vậy tôi đã sửa đổi điều này để sử dụng type. Tôi viết văn bản của tôi vào tập tin, và sử dụng lệnh type myfile.txt | clip.
Mixopteryx

1
Mặc dù đây là câu trả lời tốt nhất cho tôi, nhưng nó có một vấn đề (Python 3.5, Windows 10); một dòng mới không mong muốn luôn được thêm vào cuối chuỗi. Làm thế nào để tránh nó?
mmj

42

Bạn cũng có thể sử dụng ctypes để truy cập vào API Windows và tránh gói pywin32 lớn. Đây là những gì tôi sử dụng (xin lỗi phong cách nghèo nàn, nhưng ý tưởng là có):

import ctypes

# Get required functions, strcpy..
strcpy = ctypes.cdll.msvcrt.strcpy
ocb = ctypes.windll.user32.OpenClipboard    # Basic clipboard functions
ecb = ctypes.windll.user32.EmptyClipboard
gcd = ctypes.windll.user32.GetClipboardData
scd = ctypes.windll.user32.SetClipboardData
ccb = ctypes.windll.user32.CloseClipboard
ga = ctypes.windll.kernel32.GlobalAlloc    # Global memory allocation
gl = ctypes.windll.kernel32.GlobalLock     # Global memory Locking
gul = ctypes.windll.kernel32.GlobalUnlock
GMEM_DDESHARE = 0x2000

def Get():
  ocb(None) # Open Clip, Default task

  pcontents = gcd(1) # 1 means CF_TEXT.. too lazy to get the token thingy...

  data = ctypes.c_char_p(pcontents).value

  #gul(pcontents) ?
  ccb()

  return data

def Paste(data):
  ocb(None) # Open Clip, Default task

  ecb()

  hCd = ga(GMEM_DDESHARE, len(bytes(data,"ascii")) + 1)

  pchData = gl(hCd)

  strcpy(ctypes.c_char_p(pchData), bytes(data, "ascii"))

  gul(hCd)

  scd(1, hCd)

  ccb()

5
Ít nhất trong python 2.6 x64, tôi phải đổi bytes(data,"ascii")sang bytes(data). Cảm ơn bạn đã trả lời câu hỏi, tôi không thể sử dụng pywin32 hoặc tk hoặc một số thứ khác và điều này hoạt động.
Pat Corwin

1
Không phải lo lắng, nhưng lưu ý rằng dữ liệu được trả về từ bảng tạm thực sự ở dạng mã hóa khác, tôi tin rằng đó là Windows CP-1252. Điều này đã phần nào bị hack cùng nhau, nhưng nếu bạn không sử dụng mã hóa chính xác thì các ký tự không phải mã ascii sẽ phát sinh lỗi hoặc giải mã không chính xác.
kapace

Tên biến không cần bình luận và mọi thứ nên hỗ trợ Unicode.
Cees Timmerman

bytes(data, "mbcs")sẽ làm việc với mã hóa mặc định của windows. Cho phép tôi tải cái này vào clipboard "másreas ç saod é í ó u* ü ö ï/"và đọc lại chính xác.
mvbentes

1
sử dụng mbcs mang lại cho tôi điều này: OSError: ngoại lệ: vi phạm quyền truy cập bằng văn bản 0x0000000000000000
Seaky Lone

35

Bạn có thể sử dụng pyperclip - mô-đun clipboard đa nền tảng. Hoặc Xerox - mô-đun tương tự, ngoại trừ yêu cầu mô-đun win32 Python hoạt động trên Windows.


pyperclipkhông làm Unicode trên Windows. win32clipboardlàm.
Cees Timmerman

13
pyperclipBản vá của tôi đã được chấp nhận; c:\python34\Scripts\pip install --upgrade pyperclipđể xử lý văn bản Unicode.
Cees Timmerman

1
Phải mất một thời gian tôi mới biết rằng đây là pyperclip, không phải paperclip. Ngoài ra, như năm 2016, pyperclip cũng hoạt động với các ký tự Unicode. Tôi đã thử nghiệm các ký tự ± ° © đối với αåäö để hoạt động trên Win10 64-bit, với Python 3.5 và pyperclip 1.5.27.
np8

28

Bạn có thể sử dụng những con gấu trúc tuyệt vời, có hỗ trợ trong bảng tạm, nhưng bạn cần phải vượt qua DataFrame.

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

3
+1. Tôi thích giải pháp này. Nó thậm chí còn đơn giản hơn giải pháp Tkinter được chấp nhận. Nếu bạn nhập khẩu gấu trúc bằng mọi cách, không có chi phí bổ sung. Nó cũng hoạt động trên tất cả các nền tảng. Nó thậm chí không (trong hầu hết các trường hợp) yêu cầu cài đặt một gói mới.
ChaimG

4
pyperclipdù sao thì nó cũng sử dụng , vì vậy sử dụng tốt hơnpyperpclip
maxbellec

1
Đối với hầu hết mọi người (ví dụ như tôi), pandascó sẵn nhưng import pyperclipkhông hoạt động. Vì vậy, tôi không đồng ý với "sử dụng pyperclip tốt hơn".
Bác sĩ Core

1
Nếu bạn bị hạn chế chỉ sử dụng gấu trúc, bạn có thể sử dụng pyperclip trực tiếp thông qua import pandas.io.clipboard as pypercliphoặc đặt tên cho nó bất cứ điều gì bạn muốn. Đó là nơi nó nằm trong pandas, ít nhất là
David Culbreth

1
Điều này dường như thêm một ký tự dòng mới vào chuỗi bạn sao chép
Gijs van Oort

18

Cách đơn giản nhất là với pyperclip . Hoạt động trong python 2 và 3.

Để cài đặt thư viện này, sử dụng:

pip install pyperclip

Ví dụ sử dụng:

import pyperclip

pyperclip.copy("your string")

Nếu bạn muốn lấy nội dung của bảng tạm:

clipboard_content = pyperclip.paste()

3
pyperclipmô-đun có đi kèm với Python không? Phiên bản nào? Tôi không thấy nó trong Python 2.7 ...
SamB

8
Vâng, downvote một câu trả lời dễ dàng giải quyết vấn đề trong ít hơn 5 dòng; bởi vì các chi tiết nhỏ như tham chiếu là quan trọng hơn; sử dụng tuyệt vời của stackoverflow bạn của tôi. Tôi sẽ chỉnh sửa bằng mọi cách cho các nitopperers. Mẹo cho bạn: downvote câu trả lời là vô ích hoặc không giải quyết được vấn đề; upvote câu trả lời giải quyết vấn đề hoặc ít nhất là hữu ích và đưa ra một gợi ý trong các ý kiến ​​để cải thiện một câu trả lời hữu ích thay vì bỏ qua.
maviz

2
Không có tài liệu tham khảo, bạn không giải quyết được gì. Nhưng vì bạn đã thêm liên kết, tôi sẽ xóa downvote, vì bây giờ câu trả lời là tốt. Vấn đề lớn hơn của tôi là nó trông giống như một thư viện nhập khẩu tiêu chuẩn; Nó trông giống như mã bạn có thể sao chép / dán khi không.
Gloweye

pyperclip.paste()không hoạt động với hình ảnh chỉ trả về NoneTypelỗi. nhưng hoạt động với nhấp chuột phải và sao chép sau đó sử dụng python để dán kết quả được sao chép.
JayRizzo

11

Tôi đã thử nhiều giải pháp khác nhau, nhưng đây là giải pháp đơn giản nhất vượt qua bài kiểm tra của tôi :

#coding=utf-8

import win32clipboard  # http://sourceforge.net/projects/pywin32/

def copy(text):
    win32clipboard.OpenClipboard()
    win32clipboard.EmptyClipboard()
    win32clipboard.SetClipboardText(text, win32clipboard.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()
def paste():
    win32clipboard.OpenClipboard()
    data = win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)
    win32clipboard.CloseClipboard()
    return data

if __name__ == "__main__":  
    text = "Testing\nthe “clip—board”: 📋"
    try: text = text.decode('utf8')  # Python 2 needs decode to make a Unicode string.
    except AttributeError: pass
    print("%r" % text.encode('utf8'))
    copy(text)
    data = paste()
    print("%r" % data.encode('utf8'))
    print("OK" if text == data else "FAIL")

    try: print(data)
    except UnicodeEncodeError as er:
        print(er)
        print(data.encode('utf8'))

Đã kiểm tra OK trong Python 3.4 trên Windows 8.1 và Python 2.7 trên Windows 7. Ngoài ra khi đọc dữ liệu Unicode với các nguồn cấp dữ liệu Unix được sao chép từ Windows. Dữ liệu được sao chép vẫn còn trên bảng tạm sau khi Python thoát:"Testing the “clip—board”: 📋"

Nếu bạn không muốn phụ thuộc bên ngoài, hãy sử dụng mã này (bây giờ là một phần của đa nền tảng pyperclip- C:\Python34\Scripts\pip install --upgrade pyperclip):

def copy(text):
    GMEM_DDESHARE = 0x2000
    CF_UNICODETEXT = 13
    d = ctypes.windll # cdll expects 4 more bytes in user32.OpenClipboard(None)
    try:  # Python 2
        if not isinstance(text, unicode):
            text = text.decode('mbcs')
    except NameError:
        if not isinstance(text, str):
            text = text.decode('mbcs')
    d.user32.OpenClipboard(0)
    d.user32.EmptyClipboard()
    hCd = d.kernel32.GlobalAlloc(GMEM_DDESHARE, len(text.encode('utf-16-le')) + 2)
    pchData = d.kernel32.GlobalLock(hCd)
    ctypes.cdll.msvcrt.wcscpy(ctypes.c_wchar_p(pchData), text)
    d.kernel32.GlobalUnlock(hCd)
    d.user32.SetClipboardData(CF_UNICODETEXT, hCd)
    d.user32.CloseClipboard()

def paste():
    CF_UNICODETEXT = 13
    d = ctypes.windll
    d.user32.OpenClipboard(0)
    handle = d.user32.GetClipboardData(CF_UNICODETEXT)
    text = ctypes.c_wchar_p(handle).value
    d.user32.CloseClipboard()
    return text

Bạn lấy ở win32clipboardđâu Nó không phải là một phần của Python 2.7 của tôi. Và tại sao pastesử dụng CF_TEXTthay vì CF_UNICODETEXT?
Đánh dấu tiền chuộc

@MarkRansom pywin32, và vì thử nghiệm của tôi hoạt động tốt cho đến khi tôi làm cho nó khó hơn khi sử dụng. Tôi đã cập nhật mã.
Cees Timmerman

11

Vì một số lý do, tôi chưa bao giờ có thể khiến giải pháp Tk hoạt động cho mình. Giải pháp của kapace khả thi hơn nhiều, nhưng định dạng trái với phong cách của tôi và nó không hoạt động với Unicode. Đây là một phiên bản sửa đổi.

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

Ở trên đã thay đổi kể từ khi câu trả lời này được tạo lần đầu tiên, để đối phó tốt hơn với các ký tự Unicode mở rộng và Python 3. Nó đã được thử nghiệm trong cả Python 2.7 và 3.5 và hoạt động ngay cả với biểu tượng cảm xúc như \U0001f601 (😁).


@CeesTimmerman Tôi muốn có một hệ thống Windows 8.1 để kiểm tra lý do. Tôi có thể có một cơ hội để điều tra sau ngày hôm nay. Bạn có chắc là bạn đã có văn bản trong clipboard?
Đánh dấu tiền chuộc

Đúng. Tôi đã thử nghiệm rộng rãi mã clipboard trong Python trong ba ngày qua.
Cees Timmerman

Các put()chức năng cũng cần làm việc; biểu tượng cảm xúc "" (\ U0001f400) được sao chép dưới dạng "" (\ U0001f4cb) hoặc "." chuyển sang "".
Cees Timmerman

@CeesTimmerman giải thích điều đó. Biểu diễn Unicode bên trong đã thay đổi, tôi không thể nhớ đó là 3.3 hay 3.4. Để khắc phục, nó sẽ yêu cầu mã hóa rõ ràng thành UTF-16. Đó không phải là một lỗi.
Đánh dấu tiền chuộc

1
@YngvarKristiansen Cuối cùng tôi cũng đã thực hiện được những thay đổi đó. Bây giờ tôi tự tin rằng mã này hoạt động cho hầu hết các phiên bản Python hiện đại và mọi ký tự Unicode có thể.
Đánh dấu tiền chuộc


5

Bạn có thể sử dụng mô-đun clipboard. Nó đơn giản và cực kỳ dễ sử dụng. Hoạt động với Mac , WindowsLinux .
Lưu ý: Đây là một thay thế củapyperclip

Sau khi cài đặt, nhập nó:

import clipboard

Sau đó, bạn có thể sao chép như thế này:

clipboard.copy("This is copied")

Bạn cũng có thể dán văn bản đã sao chép:

clipboard.paste()

2
Đây dường như là giải pháp tốt nhất. clipboard có thể được cài đặt với pip install clipboard.
vy32

5

Đây là cách dễ dàng và đáng tin cậy nhất mà tôi tìm thấy nếu bạn ổn tùy thuộc vào Pandas. Tuy nhiên tôi không nghĩ rằng đây chính thức là một phần của API Pandas nên nó có thể bị hỏng với các bản cập nhật trong tương lai. Nó hoạt động kể từ 0.25.3

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

3

Widgets cũng có phương thức được đặt tên .clipboard_get()trả về nội dung của clipboard (trừ khi một số loại lỗi xảy ra dựa trên loại dữ liệu trong clipboard).

Các clipboard_get()phương pháp được đề cập trong báo cáo lỗi này:
http://bugs.python.org/issue14777

Thật kỳ lạ, phương pháp này không được đề cập trong các nguồn tài liệu TkInter trực tuyến phổ biến (nhưng không chính thức) mà tôi thường đề cập đến.


3

Tôi nghĩ rằng có một giải pháp đơn giản hơn nhiều cho việc này.

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

Sau đó chạy chương trình của bạn trong dòng lệnh

python helloer.py | kẹp

Điều này sẽ dẫn đầu ra của tập tin của bạn vào clipboard


Đó là một giải pháp tốt nhưng tôi tưởng tượng rất nhiều con trăn được phát triển và chạy trong một IDE
Jesse Reza Khorasanee

2

Ngoài câu trả lời của Mark Ransom bằng cách sử dụng ctypes: Điều này không hoạt động đối với (tất cả?) X64 vì các tay cầm dường như bị cắt cụt thành kích thước int. Việc xác định rõ ràng các giá trị đối số và trả về giúp khắc phục vấn đề này.

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())

0
import wx

def ctc(text):

    if not wx.TheClipboard.IsOpened():
        wx.TheClipboard.Open()
        data = wx.TextDataObject()
        data.SetText(text)
        wx.TheClipboard.SetData(data)
    wx.TheClipboard.Close()

ctc(text)

2
Một lời giải thích về vấn đề và giải pháp sẽ hữu ích.
showdev

một chức năng để sao chép văn bản vào một bảng tạm. sử dụng thư viện python wx (tôi chưa bao giờ học TK) một giải pháp khác cho câu hỏi được hỏi ở đây.
jlk

Vui lòng chỉnh sửa câu trả lời để bao gồm lời giải thích của bạn về vấn đề / giải pháp @jlk - làm điều này thường làm cho câu trả lời hữu ích hơn. Ngoài ra, cảm ơn vì đã cố gắng, nhưng tôi cho rằng poster ban đầu có một số lý do để yêu cầu Tk cụ thể.
icedwater

0

Đoạn mã tôi chia sẻ ở đây tận dụng khả năng định dạng tệp văn bản: nếu bạn muốn sao chép một đầu ra phức tạp vào bảng tạm thì sao? (Nói một mảng numpy trong cột hoặc danh sách một cái gì đó)

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

Tôi chỉ làm việc cho windows, có thể được điều chỉnh cho linux hoặc mac tôi đoán. Có lẽ hơi phức tạp ...

thí dụ:

>>>cp2clip(["ET","phone","home"])
>>>0

Ctrl + V trong bất kỳ trình soạn thảo văn bản nào:

ET
phone
home

0

Đây là câu trả lời cải tiến của phun .

Lưu ý 2 cuộc gọi update()200 mstrì hoãn giữa chúng. Chúng bảo vệ các ứng dụng đóng băng do trạng thái không ổn định của clipboard:

from Tkinter import Tk
import time     

r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('some string')

r.update()
time.sleep(.2)
r.update()

r.destroy()

0

Sử dụng thư viện clipboard của python!

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

Clipboard chứa 'abc' bây giờ. Chúc mừng dán!


0

Không phải tất cả các câu trả lời đều hoạt động cho các cấu hình python khác nhau của tôi, vì vậy giải pháp này chỉ sử dụng mô đun quy trình con. Tuy nhiên, copy_keywordphải pbcopydành cho Mac hoặc clipcho Windows:

import subprocess
subprocess.run('copy_keyword', universal_newlines=True, input='New Clipboard Value 😀')

Đây là một số mã mở rộng hơn tự động kiểm tra hệ điều hành hiện tại là gì:

import platform
import subprocess

copy_string = 'New Clipboard Value 😀'

# Check which operating system is running to get the correct copying keyword.
if platform.system() == 'Darwin':
    copy_keyword = 'pbcopy'
elif platform.system() == 'Windows':
    copy_keyword = 'clip'

subprocess.run(copy_keyword, universal_newlines=True, input=copy_string)

IDLE gặp sự cố khi bạn cố dán chuỗi đó.
Max Does Stuff

@MaxDoesStuff Hãy thử mà không cần biểu tượng cảm xúc. Tôi không biết tại sao nó không hoạt động trong IDLE mặc định, nhưng nó hoạt động trong các IDLE khác.
Fetchinator7

0

Bạn có thể sử dụng mô-đun winclip32! Tải về:

pip install winclip32

sao chép:

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

để có được:

import winclip32
print(winclip32.get_clipboard_data(winclip32.UNICODE_STD_TEXT))

để biết thêm thông tin: https://pypi.org/project/winclip32/


-1

Đoạn mã để sao chép bảng tạm:

Tạo một mã trình bao bọc Python trong một mô-đun có tên ( clipboard.py ):

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

def getText():
    return Clipboard.GetText()

Sau đó nhập mô-đun trên vào mã của bạn.

import io
import clipboard
code = clipboard.getText()
print code
code = "abcd"
clipboard.setText(code)

Tôi phải cung cấp tín dụng cho bài đăng trên blog Truy cập Clipboard trong IronPython .


-2

bạn có thể thử điều này:

command = 'echo content |clip'
subprocess.check_call(command, shell=True)

-9
from Tkinter import Tk
clip = Tk()

có lẽ bạn có thể xây dựng một thông báo lỗi mà bạn nhận được và phiên bản của python bạn đang sử dụng. 2 dòng tôi đã viết hoạt động với python 2. cảm ơn bạn
tagoma

2
Câu hỏi là "làm cách nào để sao chép một chuỗi vào bảng tạm trên Windows bằng Python". Chắc chắn điều này không sụp đổ nhưng nó không hoàn toàn thỏa mãn trong câu hỏi ở chỗ nó thực sự không làm gì cả
Antti Haapala

2
H: làm cách nào để sao chép một chuỗi vào bảng tạm của Windows bằng Python? A: nhập thư viện GUI và tạo đối tượng gốc. . Xin lỗi, làm thế nào điều này thậm chí trả lời câu hỏi đã nêu?
Martijn Pieters

với python3 bạn có thể làm gì đó dọc theo các dòng này: import tkinter> tki = tkinter.Tk ()> tki.clipboard_clear () # xóa bảng tạm hiện tại> mystring = 'Hello World'> tki.clipboard_append (mystring)> tki.clip_ ) Ra [19]: 'Xin chào thế giới'>
tagoma

2
Sau đó làm cho câu trả lời. Vì nó đứng bạn không thực sự có bất cứ điều gì hữu ích ở đây. Bạn đã thử nghiệm điều đó trên Windows chưa?
Martijn Pieters
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.