2011-09-30 158 views
14

例如,如果一個python腳本會吐出一個字符串,給出一個新編寫的文件的路徑,我將在運行該腳本後立即編輯這個文件,將它直接發送到系統剪貼板會非常好比STDOUT有沒有辦法直接發送python輸出到剪貼板?

+0

該解決方案將取決於操作系統,是否沒問題? – NullUserException

+0

@NullUserExceptionఠ_ఠ我假設它會,但我完全在Linux內部工作,所以我想要一個針對Linux的解決方案。 – nye17

回答

22

您可以使用外部程序,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的剪貼板herehere

一個快速和骯髒的功能,我創建的處理這個問題:

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選擇我。

+0

我測試了這個片段,但它似乎不適用於我的設置。做完'python abovescript.py'後,我在終端中點擊我的鼠標,但是沒有'Hello,World'出現。 – nye17

+0

@ nye17你在嘗試哪種方法?它會給你什麼錯誤? – NullUserException

+1

第一個「剪貼板」一個,不起作用,但根本沒有錯誤報告。 – nye17

10

這不是一個真正的Python問題,而是一個shell問題。通過將Python腳本的輸出傳送到xclip命令中,您可以將Python腳本(或任何命令)的輸出發送到剪貼板而不是標準輸出。

myscript.py | xclip 

如果xclip尚未安裝在系統上(它不是默認情況下),你這是怎麼得到它:

sudo apt-get install xclip 

如果你想直接從您的Python腳本做我想你可以掏腰包並使用os.system()運行xclip命令,這很簡單但不推薦使用。有許多方法可以做到這一點(請參閱subprocess模塊,瞭解當前的官方方式)。你要執行的命令是這樣的:

echo -n /path/goes/here | xclip 

獎勵:在Mac OS X中,可以通過管道進入pbcopy做同樣的事情。

+0

我更喜歡將腳本指定的字符串發送到剪貼板,而不是將所有輸出傳送到'xclip',因爲最終輸出和所需字符串不一定相同。但是你是對的,我可以使用'subprocess'將它發送到'xclip',儘管我寧願稍微不那麼「蠻力」的方式。 – nye17

+0

在python中這樣做更好 - 允許代碼輸出的不僅僅是文件名... – tobyodavies

+0

添加一個命令行標誌來抑制除了路徑名之外的所有內容,或者可選地將其發送到標準錯誤(所以你可以將它連接到'xclip'而不會引起其他問題)。無論如何,你都需要一個命令行標誌,因爲你不想在沒有被明確告知的情況下摧毀用戶的剪貼板,爲什麼不讓它更加unixy? – kindall

2

正如其他人指出,這不是「Python和電池」,因爲它涉及到GUI操作。所以它是平臺依賴的。如果你在windows上,你可以使用win32 Python模塊和Access win32剪貼板操作。 我的建議是挑選一個GUI工具包(用於QT的PyQT/PySide,用於GTK +的PyGTK或用於wxWidgets的wxPython)。然後使用剪貼板操作。如果你不需要工具包的重量級的東西,那麼你的包裝將在Windows上使用win32包裝,並在其他平臺上提供,並相應切換!

對於wxPython的下面是一些有用的鏈接:

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

http://wiki.wxpython.org/ClipBoard

http://www.python-forum.org/pythonforum/viewtopic.php?f=1&t=25549

5

由於它被張貼在另一個answer,如果你想解決蟒之內,你可以使用Pyperclip,它具有跨平臺的附加好處。

>>> import pyperclip 
>>> pyperclip.copy('The text to be copied to the clipboard.') 
>>> pyperclip.paste() 
'The text to be copied to the clipboard.' 
相關問題