123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- import subprocess
- from pandas.compat import PY2, text_type
- from .exceptions import PyperclipException
- EXCEPT_MSG = """
- Pyperclip could not find a copy/paste mechanism for your system.
- For more information, please visit https://pyperclip.readthedocs.org """
- def init_osx_clipboard():
- def copy_osx(text):
- p = subprocess.Popen(['pbcopy', 'w'],
- stdin=subprocess.PIPE, close_fds=True)
- p.communicate(input=text.encode('utf-8'))
- def paste_osx():
- p = subprocess.Popen(['pbpaste', 'r'],
- stdout=subprocess.PIPE, close_fds=True)
- stdout, stderr = p.communicate()
- return stdout.decode('utf-8')
- return copy_osx, paste_osx
- def init_gtk_clipboard():
- import gtk
- def copy_gtk(text):
- global cb
- cb = gtk.Clipboard()
- cb.set_text(text)
- cb.store()
- def paste_gtk():
- clipboardContents = gtk.Clipboard().wait_for_text()
- # for python 2, returns None if the clipboard is blank.
- if clipboardContents is None:
- return ''
- else:
- return clipboardContents
- return copy_gtk, paste_gtk
- def init_qt_clipboard():
- # $DISPLAY should exist
- # Try to import from qtpy, but if that fails try PyQt5 then PyQt4
- try:
- from qtpy.QtWidgets import QApplication
- except ImportError:
- try:
- from PyQt5.QtWidgets import QApplication
- except ImportError:
- from PyQt4.QtGui import QApplication
- app = QApplication.instance()
- if app is None:
- app = QApplication([])
- def copy_qt(text):
- cb = app.clipboard()
- cb.setText(text)
- def paste_qt():
- cb = app.clipboard()
- return text_type(cb.text())
- return copy_qt, paste_qt
- def init_xclip_clipboard():
- def copy_xclip(text):
- p = subprocess.Popen(['xclip', '-selection', 'c'],
- stdin=subprocess.PIPE, close_fds=True)
- p.communicate(input=text.encode('utf-8'))
- def paste_xclip():
- p = subprocess.Popen(['xclip', '-selection', 'c', '-o'],
- stdout=subprocess.PIPE, close_fds=True)
- stdout, stderr = p.communicate()
- return stdout.decode('utf-8')
- return copy_xclip, paste_xclip
- def init_xsel_clipboard():
- def copy_xsel(text):
- p = subprocess.Popen(['xsel', '-b', '-i'],
- stdin=subprocess.PIPE, close_fds=True)
- p.communicate(input=text.encode('utf-8'))
- def paste_xsel():
- p = subprocess.Popen(['xsel', '-b', '-o'],
- stdout=subprocess.PIPE, close_fds=True)
- stdout, stderr = p.communicate()
- return stdout.decode('utf-8')
- return copy_xsel, paste_xsel
- def init_klipper_clipboard():
- def copy_klipper(text):
- p = subprocess.Popen(
- ['qdbus', 'org.kde.klipper', '/klipper', 'setClipboardContents',
- text.encode('utf-8')],
- stdin=subprocess.PIPE, close_fds=True)
- p.communicate(input=None)
- def paste_klipper():
- p = subprocess.Popen(
- ['qdbus', 'org.kde.klipper', '/klipper', 'getClipboardContents'],
- stdout=subprocess.PIPE, close_fds=True)
- stdout, stderr = p.communicate()
- # Workaround for https://bugs.kde.org/show_bug.cgi?id=342874
- # TODO: https://github.com/asweigart/pyperclip/issues/43
- clipboardContents = stdout.decode('utf-8')
- # even if blank, Klipper will append a newline at the end
- assert len(clipboardContents) > 0
- # make sure that newline is there
- assert clipboardContents.endswith('\n')
- if clipboardContents.endswith('\n'):
- clipboardContents = clipboardContents[:-1]
- return clipboardContents
- return copy_klipper, paste_klipper
- def init_no_clipboard():
- class ClipboardUnavailable(object):
- def __call__(self, *args, **kwargs):
- raise PyperclipException(EXCEPT_MSG)
- if PY2:
- def __nonzero__(self):
- return False
- else:
- def __bool__(self):
- return False
- return ClipboardUnavailable(), ClipboardUnavailable()
|