본문 바로가기

IT/프로그래밍/Python

Mac환경에서 python으로 clipboard 값 가져오기

개인적으로 진행하고 있는 프로젝트에서 Python을 이용하여 mac환경에서 wxPython으로 개발을

하고 있는데 wxPython이 mac 환경을 제대로 지원하지 않다보니 font의 인코딩 문제라던지 여러가지

자잘한 버그들이 많이 발생을 한다.

이번에도 클립보드에 있는 값을 가져오기 위해서 처음에는 wx에서 기본으로 지원하는 Clipboard함수를

사용하였는데 clipboard의 값을 제대로 가져오지 못하고 깨져서 나온다.

해당문제를 해결하는 방법을 찾아본 결과 mac에서는 방법이 두가지 있었다.

  1. subprocess 모듈을 이용하는 방법

2.  PyObjC 모듈을 이용하는 방법

하나씩 보자~

개발 환경 : 

mac os : 매버릭스, python : 2.7.9, wxPython : 3.0.2.0 1. subprocess 사용:

해당 모듈은 mac의 shall 스크립트의 명령어를 파이썬에서 사용할 수 있게 해준다. 해당 모듈은 파이썬 기본 모듈이다.

import subprocess

# GetClipboard
def getClipboardData():
    p = subprocess.Popen(['pbpaste'], stdout=subprocess.PIPE)
    retcode = p.wait()
    content = p.stdout.read()
    return content

# SetClipboard
def setClipboardData(_str):
    p = subprocess.Popen(['pbcopy'], stdin=subprocess.PIPE)
    p.stdin.write(_str)
    p.stdin.close()
    retcode = p.wait()
  1. PyObjC 모듈을 이용한 방법

-> ObjC를 python으로 랩핑한 것 objc의 기능들을 사용할 수 있다. 기본 모듈이 아니라서 따로 설치해야 한다.

PyObjC 설치 : 

$ pip install -U pyobjc

from Foundation import *
from AppKit import *

# SetClipboard
def setClipboardData(_str):
    p = NSPasteboard.generalPasteboard()
    p.declareTypes_owner_([NSStringPboardType], None)
    newStr = NSString.stringWithString_(_str)
    newData = newStr.nsstring().dataUsingEncoding_(NSUTF8StringEncoding)
    p.setData_forType_(newData, NSStringPboardType)

# GetClipboard
def getClipboardData
    p = NSPasteboard.generalPasteboard()
    content = p.stringForType_(NSStringPboardType)
    return content

위의 두가지 방법 모두 글씨가 깨지는 문제 없이 정상적으로 작동하였으므로 편한걸 가져다가 사용하면 될듯 하다.


BlogWriter