मैं एक बुनियादी विंडोज एप्लिकेशन बनाने की कोशिश कर रहा हूं जो उपयोगकर्ता इनपुट से एक स्ट्रिंग बनाता है और फिर इसे क्लिपबोर्ड में जोड़ता है। मैं पायथन का उपयोग करके क्लिपबोर्ड में एक स्ट्रिंग की प्रतिलिपि कैसे बना सकता हूं?
मैं एक बुनियादी विंडोज एप्लिकेशन बनाने की कोशिश कर रहा हूं जो उपयोगकर्ता इनपुट से एक स्ट्रिंग बनाता है और फिर इसे क्लिपबोर्ड में जोड़ता है। मैं पायथन का उपयोग करके क्लिपबोर्ड में एक स्ट्रिंग की प्रतिलिपि कैसे बना सकता हूं?
जवाबों:
वास्तव में, pywin32
और ctypes
इस सरल कार्य के लिए एक ओवरकिल लगता है। Tkinter
एक क्रॉस-प्लेटफ़ॉर्म GUI फ्रेमवर्क है, जो डिफ़ॉल्ट रूप से पायथन के साथ जहाज करता है और क्लिपबोर्ड एक्सेस करने के तरीकों के साथ-साथ अन्य शांत सामान भी है।
अगर आप सभी को सिस्टम क्लिपबोर्ड पर कुछ पाठ डालना है, तो यह ऐसा करेगा:
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()
और यह सब, मंच-विशिष्ट तृतीय-पक्ष पुस्तकालयों के साथ गड़बड़ करने की कोई जरूरत नहीं है।
यदि आप पायथन 3 का उपयोग कर रहे हैं, तो TKinter
साथ बदलें tkinter
।
r.destroy()
। एक बार जब मैं कॉल करता हूं, तो क्लिपबोर्ड खाली हो जाता है और Ctrl-V को दबाने से लक्ष्य ऐप फ्रीज हो सकता है। (OS: विंडोज 7 x64)
मेरे पास समाधान नहीं था, बस एक समाधान था।
विंडोज विस्टा में एक इनबिल्ट कमांड clip
होती है, जो कमांड लाइन से कमांड के आउटपुट को लेती है और क्लिपबोर्ड में डालती है। उदाहरण के लिए, ipconfig | clip
।
इसलिए मैंने os
मॉड्यूल के साथ एक फ़ंक्शन बनाया जो एक स्ट्रिंग लेता है और इनबिल्ट विंडोज समाधान का उपयोग करके इसे क्लिपबोर्ड पर जोड़ता है।
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)
यदि आप Windows XP का उपयोग कर रहे हैं, तो यह सीधे कॉपी और Windows XP Pro के कमांड प्रॉम्प्ट से सीधे क्लिपबोर्ड पर पेस्ट करने के चरणों का पालन करेगा ।
text
होता है | calc.exe
?
text with " quotes and | pipe
हो जाता है "text with "" quotes and | pipe"
इस 95 से अधिक उम्र के खिड़कियों के साथ सिस्टम पर समस्या हो सकती है हालांकि
type
। मैं अपना पाठ फाइल करने के लिए लिखता हूं, और कमांड का उपयोग करता हूं type myfile.txt | clip
।
आप विंडोज एपीआई में टैप करने के लिए ctypes का उपयोग भी कर सकते हैं और बड़े पैमाने पर pywin32 पैकेज से बच सकते हैं। यह वही है जो मैं उपयोग करता हूं (खराब शैली का बहाना है, लेकिन विचार यह है):
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()
bytes(data,"ascii")
करने के लिए bytes(data)
। प्रश्न का उत्तर देने के लिए धन्यवाद, मैं pywin32 या tk या कई अन्य चीजों का उपयोग नहीं कर सकता और यह काम करता है।
bytes(data, "mbcs")
डिफ़ॉल्ट डिफ़ॉल्ट एन्कोडिंग के साथ काम करेंगे। मुझे "másreas ç saod é í ó u* ü ö ï/"
इसे क्लिपबोर्ड पर लोड करने की अनुमति दी और इसे सही ढंग से वापस पढ़ा।
आप पाइपरलिप - क्रॉस-प्लेटफॉर्म क्लिपबोर्ड मॉड्यूल का उपयोग कर सकते हैं । या ज़ेरॉक्स - समान मॉड्यूल, सिवाय विंडोज पर काम करने के लिए win32 पायथन मॉड्यूल की आवश्यकता होती है।
pyperclip
विंडोज पर यूनिकोड नहीं करता है। win32clipboard
कर देता है।
pyperclip
पैच स्वीकार कर लिया गया; c:\python34\Scripts\pip install --upgrade pyperclip
यूनिकोड पाठ को संभालने के लिए।
pyperclip
, नहीं paperclip
। इसके अलावा, 2016 की तरह, यूनिकोड के पात्रों के साथ भी पाइपरलिप काम करता है। मैंने पात्रों का परीक्षण किया है © ° © © α 64åäö Win10 64-बिट पर काम करने के लिए, पायथन 3.5 और पाइपरलिप 1.5.27 के साथ।
आप उत्कृष्ट पांडा का उपयोग कर सकते हैं, जिसमें एक क्लिपबोर्ड समर्थन है, लेकिन आपको डेटाफ़्रेम से गुजरने की आवश्यकता है।
import pandas as pd
df=pd.DataFrame(['Text to copy'])
df.to_clipboard(index=False,header=False)
pyperclip
वैसे भी उपयोग करता है, इसलिए बेहतर उपयोगpyperpclip
pandas
आसानी से उपलब्ध है, लेकिन import pyperclip
काम नहीं करता है। इसलिए मैं "बेहतर उपयोग pyperclip" से सहमत नहीं हूं।
import pandas.io.clipboard as pyperclip
या इसे जो चाहें नाम दे सकते हैं। यही वह जगह है जहां यह pandas
कम से कम बैठता है
सबसे सरल तरीका पाइपरलिप के साथ है । अजगर 2 और 3 में काम करता है।
इस लाइब्रेरी को स्थापित करने के लिए, उपयोग करें:
pip install pyperclip
उदाहरण उपयोग:
import pyperclip
pyperclip.copy("your string")
यदि आप क्लिपबोर्ड की सामग्री प्राप्त करना चाहते हैं:
clipboard_content = pyperclip.paste()
pyperclip
मॉड्यूल पायथन के साथ आता है? कौन से संस्करण? मैं इसे पायथन 2.7 में नहीं देखता ...
pyperclip.paste()
छवियों के साथ काम नहीं करता है बस NoneType
त्रुटि देता है। लेकिन दाहिने क्लिक के साथ काम करता है और फिर कॉपी किए गए परिणामों को चिपकाने के लिए अजगर का उपयोग करता है।
मैंने विभिन्न समाधानों की कोशिश की है, लेकिन यह सबसे सरल है जो मेरा परीक्षण पास करता है :
#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'))
विंडोज 8.1 पर पायथन 3.4 में ठीक और विंडोज 7 पर पायथन 2.7 का परीक्षण किया गया। इसके अलावा यूनिक्स के साथ यूनिकोड डेटा को पढ़ने पर भी विंडोज से कॉपी किया गया। अजगर डेटा क्लिपबोर्ड पर रहता है जब पायथन बाहर निकलता है:"Testing
the “clip—board”: 📋"
यदि आप कोई बाहरी निर्भरता नहीं चाहते हैं, तो इस कोड का उपयोग करें (अब क्रॉस-प्लेटफॉर्म का हिस्सा 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
win32clipboard
? यह मेरे पायथन 2.7 का हिस्सा नहीं है। और के बजाय का paste
उपयोग क्यों करता CF_TEXT
है CF_UNICODETEXT
?
किसी कारण से मैं कभी भी मेरे लिए काम करने के लिए 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
इस उत्तर को पहली बार बनाए जाने के बाद से ऊपर बदल गया है, विस्तारित यूनिकोड वर्णों और पायथन 3 के साथ बेहतर तालमेल करने के लिए। इसे पायथन 2.7 और 3.5 दोनों में परीक्षण किया गया है, और इमोजी जैसे के साथ भी काम करता है \U0001f601 (😁)
।
put()
समारोह भी काम की जरूरत है; इमोजी "o" (\ U0001f400) को "(" (\ U0001f4cb), या "📋" के रूप में कॉपी किया जाता है। "📋" में बदल जाता है।
ऐसा लगता है कि आपको अपने साइट-पैकेज में win32clipboard जोड़ने की आवश्यकता है। यह pywin32 पैकेज का हिस्सा है
आप मॉड्यूल का उपयोग कर सकते हैं clipboard
। इसका सरल और बेहद आसान उपयोग है। मैक , विंडोज और लिनक्स के साथ काम करता है ।
नोट: इसका एक विकल्प हैpyperclip
स्थापित करने के बाद, इसे आयात करें:
import clipboard
तो आप इस तरह से कॉपी कर सकते हैं:
clipboard.copy("This is copied")
आप कॉपी किए गए पाठ को भी चिपका सकते हैं:
clipboard.paste()
pip install clipboard
।
यदि आप पंडों के आधार पर ठीक हैं, तो यहां सबसे आसान और विश्वसनीय तरीका मुझे मिल गया है। हालांकि मुझे नहीं लगता कि यह आधिकारिक रूप से पंडास एपीआई का हिस्सा है, इसलिए यह भविष्य के अपडेट के साथ टूट सकता है। यह 0.25.3 के रूप में काम करता है
from pandas.io.clipboard import copy
copy("test")
विजेट में विधि भी होती .clipboard_get()
है जो क्लिपबोर्ड की सामग्री को लौटाती है (जब तक कि क्लिपबोर्ड में डेटा के प्रकार के आधार पर किसी प्रकार की त्रुटि नहीं होती है)।
clipboard_get()
विधि इस बग रिपोर्ट में बताया गया है:
http://bugs.python.org/issue14777
अजीब बात है, इस पद्धति का उल्लेख आम (लेकिन अनौपचारिक) ऑनलाइन TkInter प्रलेखन स्रोतों में नहीं किया गया था, जिन्हें मैं आमतौर पर संदर्भित करता हूं।
मुझे लगता है कि इसके लिए बहुत सरल उपाय है।
name = input('What is your name? ')
print('Hello %s' % (name) )
फिर कमांड लाइन में अपना प्रोग्राम चलाएं
अजगर का अभिवादन | क्लिप
यह आपकी फ़ाइल के आउटपुट को क्लिपबोर्ड पर पाइप करेगा
Ctypes का उपयोग करके मार्क रैंसम के जवाब के अलावा : यह (सभी?) X64 सिस्टम के लिए काम नहीं करता है क्योंकि हैंडल को int-size से छोटा किया जाना प्रतीत होता है। स्पष्ट रूप से आर्ग्स और रिटर्न मान को परिभाषित करने से इस समस्या पर काबू पाने में मदद मिलती है।
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())
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)
मेरे द्वारा यहां साझा की गई स्निपेट पाठ फ़ाइलों को प्रारूपित करने की क्षमता का लाभ उठाती है: यदि आप क्लिपबोर्ड पर एक जटिल आउटपुट को कॉपी करना चाहते हैं तो क्या होगा? (स्तंभ या किसी चीज़ की सूची में एक सुस्पष्ट सरणी कहें)
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
केवल खिड़कियों के लिए काम करता है, मुझे लगता है कि लिनक्स या मैक के लिए अनुकूलित किया जा सकता है। शायद थोड़ा जटिल ...
उदाहरण:
>>>cp2clip(["ET","phone","home"])
>>>0
किसी भी पाठ संपादक में Ctrl + V:
ET
phone
home
यह एटमाइज़र का बेहतर उत्तर है ।
उनके बीच देरी update()
और 200 ms
देरी के 2 कॉल नोट करें। क्लिपबोर्ड की अस्थिर स्थिति के कारण वे फ्रीजिंग अनुप्रयोगों की रक्षा करते हैं:
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()
अजगर की क्लिपबोर्ड लाइब्रेरी का उपयोग करें!
import clipboard as cp
cp.copy("abc")
क्लिपबोर्ड में अब 'एबीसी' है। हैप्पी पेस्टिंग!
मेरे सभी अजगर विन्यासों के लिए सभी उत्तरों ने काम नहीं किया है, इसलिए यह समाधान केवल सबप्रोसेस मॉड्यूल का उपयोग करता है। हालांकि, मैक के लिए या विंडोज के लिए copy_keyword
होना चाहिए :pbcopy
clip
import subprocess
subprocess.run('copy_keyword', universal_newlines=True, input='New Clipboard Value 😀')
यहां कुछ और व्यापक कोड हैं जो स्वचालित रूप से जांचते हैं कि वर्तमान ऑपरेटिंग सिस्टम क्या है:
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)
आप winclip32 मॉड्यूल का उपयोग कर सकते हैं! इंस्टॉल:
pip install winclip32
प्रतिलिपि बनाना:
import winclip32
winclip32.set_clipboard_data(winclip32.UNICODE_STD_TEXT, "some text")
लेना:
import winclip32
print(winclip32.get_clipboard_data(winclip32.UNICODE_STD_TEXT))
अधिक जानकारी के लिए: https://pypi.org/project/winclip32/
क्लिपबोर्ड की प्रतिलिपि बनाने के लिए कोड स्निपेट:
एक क्लिपर पायथन कोड बनाएं, जिसका नाम मॉड्यूल है ( क्लिपबोर्डहोम ):
import clr
clr.AddReference('System.Windows.Forms')
from System.Windows.Forms import Clipboard
def setText(text):
Clipboard.SetText(text)
def getText():
return Clipboard.GetText()
फिर उपरोक्त मॉड्यूल को अपने कोड में आयात करें।
import io
import clipboard
code = clipboard.getText()
print code
code = "abcd"
clipboard.setText(code)
मुझे आयरनपाइथन में ब्लॉग पोस्ट क्लिपबोर्ड एक्सेस का श्रेय देना चाहिए ।
from Tkinter import Tk
clip = Tk()