사용자 입력으로 문자열을 작성한 다음 클립 보드에 추가하는 기본 Windows 응용 프로그램을 만들려고합니다. 파이썬을 사용하여 문자열을 클립 보드에 복사하는 방법은 무엇입니까?
사용자 입력으로 문자열을 작성한 다음 클립 보드에 추가하는 기본 Windows 응용 프로그램을 만들려고합니다. 파이썬을 사용하여 문자열을 클립 보드에 복사하는 방법은 무엇입니까?
답변:
사실, 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()
그리고 그게 전부입니다. 플랫폼 별 써드 파티 라이브러리를 엉망으로 만들 필요가 없습니다.
파이썬 3를 사용하는 경우, 교체 TKinter
와 함께 tkinter
.
r.destroy()
. 호출하면 클립 보드가 비워지고 Ctrl-V를 누르면 대상 앱이 정지 될 수 있습니다. (OS : Windows 7 x64)
해결책이 없었으며 해결 방법 만 있습니다.
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)
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를 사용하여 Windows API를 활용하고 대규모 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")
Windows 기본 인코딩으로 작동합니다. 이것을 클립 보드에로드 할 수있었습니다"másreas ç saod é í ó u* ü ö ï/"
하고 올바르게 읽을 수있었습니다.
pyperclip- 크로스 플랫폼 클립 보드 모듈을 사용할 수 있습니다 . 또는 Xerox -win32 Python 모듈이 Windows에서 작동해야한다는 점을 제외하고 유사한 모듈입니다.
pyperclip
Windows에서 유니 코드를 수행하지 않습니다. win32clipboard
그렇습니다.
pyperclip
패치가 수락되었습니다. c:\python34\Scripts\pip install --upgrade pyperclip
유니 코드 텍스트를 처리합니다.
pyperclip
하지 paperclip
. 또한 2016 년과 같이 pyperclip은 유니 코드 문자와도 작동합니다. Python 3.5 및 pyperclip 1.5.27을 사용하여 Win10 64 비트에서 작동하도록 문자 ± ° ©© αβγθΔΨΦåäö를 테스트했습니다.
클립 보드를 기본적으로 지원하는 우수한 팬더를 사용할 수 있지만 DataFrame을 통과해야합니다.
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
적어도 그 안에있는 곳입니다
가장 간단한 방법은 pyperclip 입니다. 파이썬 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'))
Windows 8.1의 Python 3.4 및 Windows 7의 Python 2.7에서 OK로 테스트되었습니다. 또한 Windows에서 복사 한 Unix 줄 바꿈으로 유니 코드 데이터를 읽을 때도 마찬가지입니다. 복사 한 데이터는 Python이 종료 된 후 클립 보드에 유지됩니다."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 솔루션을 사용할 수 없었습니다. kapace의 솔루션 은 훨씬 더 작동 가능하지만 형식이 내 스타일과 상반되며 유니 코드에서는 작동하지 않습니다. 다음은 수정 된 버전입니다.
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
확장 된 유니 코드 문자 및 Python 3에 더 잘 대처하기 위해이 답변이 처음 작성된 이후 위의 내용이 변경되었습니다 .Python 2.7 및 3.5 모두에서 테스트되었으며 같은 이모티콘으로도 작동합니다 \U0001f601 (😁)
.
put()
기능에는 작업이 필요합니다. 그림 이모티콘 "📋"(\ U0001f400)은 "🐀"(\ U0001f4cb) 또는 "📋"로 복사됩니다. "📋"로 바뀝니다.
사이트 패키지에 win32clipboard를 추가해야합니다. pywin32 패키지 의 일부입니다
위젯에는 이름이 지정된 메소드도 있습니다 .clipboard_get()
에는 클립 보드의 내용을 반환하는 (클립 보드의 데이터 유형에 따라 오류가 발생하지 않는 한).
clipboard_get()
방법이 버그 보고서에 언급 :
http://bugs.python.org/issue14777
이상하게도,이 방법은 내가 일반적으로 참조하는 일반적인 (비공식적 인) 온라인 TkInter 문서 소스에서 언급되지 않았습니다.
나는 이것에 훨씬 간단한 해결책이 있다고 생각합니다.
name = input('What is your name? ')
print('Hello %s' % (name) )
그런 다음 명령 행에서 프로그램을 실행하십시오.
파이썬 greeter.py | 클립
파일의 출력을 클립 보드로 파이프합니다
ctypes를 사용한 Mark Ransom의 대답 외에도 핸들이 int 크기로 잘린 것처럼 보이므로 (모든?) x64 시스템에서는 작동하지 않습니다. 인수와 반환 값을 명시 적으로 정의하면이 문제를 극복하는 데 도움이됩니다.
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)
여기서 공유하는 스 니펫은 텍스트 파일을 포맷하는 기능을 활용합니다. 복잡한 출력을 클립 보드에 복사하려면 어떻게해야합니까? (열에있는 numpy 배열 또는 무언가의 목록을 말하십시오)
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
Windows에서만 작동하며 Linux 또는 Mac에 맞게 조정할 수 있습니다. 어쩌면 조금 복잡한 ...
예:
>>>cp2clip(["ET","phone","home"])
>>>0
모든 텍스트 편집기에서 Ctrl + V :
ET
phone
home
모든 답변이 다양한 파이썬 구성에서 작동하지는 않았 으므로이 솔루션은 하위 프로세스 모듈 만 사용합니다. 그러나 Mac 또는 Windows 용 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))
클립 보드를 복사하는 코드 스 니펫 :
이름이 ( clipboard.py ) 모듈에 랩퍼 Python 코드를 작성하십시오 .
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)
IronPython 의 블로그 게시물 클립 보드 액세스에 크레딧을 제공해야합니다 .
from Tkinter import Tk
clip = Tk()