Есть ли способ напрямую отправить вывод Python в буфер обмена? - PullRequest
17 голосов
/ 30 сентября 2011

Например, если скрипт python выдаст строку, указывающую путь к вновь написанному файлу, который я собираюсь редактировать сразу после запуска скрипта, было бы очень хорошо, чтобы он был напрямую отправлен в буфер обмена системы а не STDOUT.

Ответы [ 4 ]

26 голосов
/ 30 сентября 2011

Вы можете использовать внешнюю программу, xsel:

from subprocess import Popen, PIPE
p = Popen(['xsel','-pi'], stdin=PIPE)
p.communicate(input='Hello, World')

С помощью xsel вы можете установить буфер обмена, с которым хотите работать.

  • -p работает с выбором PRIMARY. Это средний щелчок один.
  • -s работает с выбором SECONDARY. Я не знаю, используется ли это больше.
  • -b работает с выбором CLIPBOARD. Это твой Ctrl + V один.

Подробнее о буферах обмена X здесь и здесь .

Быстрая и грязная функция, которую я создал, чтобы справиться с этим:

def paste(str, p=True, c=True):
    from subprocess import Popen, PIPE

    if p:
        p = Popen(['xsel', '-pi'], stdin=PIPE)
        p.communicate(input=str)
    if c:
        p = Popen(['xsel', '-bi'], stdin=PIPE)
        p.communicate(input=str)

paste('Hello', False)    # pastes to CLIPBOARD only
paste('Hello', c=False)  # pastes to PRIMARY only
paste('Hello')           # pastes to both

Вы также можете попробовать PyGTK clipboard:

import pygtk
pygtk.require('2.0')
import gtk

clipboard = gtk.clipboard_get()

clipboard.set_text('Hello, World')
clipboard.store()

Это работает с выбором Ctrl + V для меня.

8 голосов
/ 30 сентября 2011

Это не вопрос Python, а вопрос оболочки. Вы уже можете отправлять вывод скрипта Python (или любой команды) в буфер обмена вместо стандартного вывода, передавая вывод скрипта Python в команду xclip.

myscript.py | xclip

Если xclip еще не установлен в вашей системе (по умолчанию это не так), вы получите его так:

sudo apt-get install xclip

Если вы хотите сделать это непосредственно из скрипта Python, я думаю, вы можете выложить и запустить команду xclip, используя os.system(), что просто, но не рекомендуется. Есть несколько способов сделать это (см. Модуль subprocess для текущего официального способа). Команда, которую вы хотите выполнить, выглядит примерно так:

echo -n /path/goes/here | xclip

Бонус: под Mac OS X вы можете сделать то же самое, отправив по телефону pbcopy.

7 голосов
/ 01 февраля 2017

Как было написано в другом ответе , если вы хотите решить это в Python, вы можете использовать Pyperclip , который имеет дополнительное преимущество, будучи кроссплатформенным.

>>> import pyperclip
>>> pyperclip.copy('The text to be copied to the clipboard.')
>>> pyperclip.paste()
'The text to be copied to the clipboard.'
2 голосов
/ 30 сентября 2011

Как уже отмечали другие, это не «Питон и батареи», так как он включает операции с графическим интерфейсом. Так что это зависит от платформы. Если вы работаете в Windows, вы можете использовать Win32 Python Module и Access win32 clipboard. Мое предложение, однако, было бы взять один набор инструментов GUI (PyQT / PySide для QT, PyGTK для GTK + или wxPython для wxWidgets). Затем используйте операции с буфером обмена. Если вам не нужны тяжелые вещи из наборов инструментов, создайте оболочку, которая будет использовать пакет win32 для Windows и все, что доступно на другой платформе, и переключайтесь соответствующим образом!

Для wxPython вот несколько полезных ссылок:

http://www.wxpython.org/docs/api/wx.Clipboard-class.html

http://wiki.wxpython.org/ClipBoard

http://www.python -forum.org / pythonforum / viewtopic.php? Е = 1 & т = 25549 ** 1014

...