Skip to content

[Python] 使用 subprocess 來存取系統剪貼簿 (clipboard)

如果我們想要透過 Python 來撰寫一個腳本,來取得系統剪貼簿的內容設置一段文字給系統剪貼簿,我們該如何做到呢?撇開使用各式各樣不同的套件不談,其實我們可以使用 subprocess 這一內建的 Python 模組來完成。


什麼是系統剪貼簿?

系統剪貼簿system clipboard)是一個非常方便的東西,讓使用者可以在不同的軟體、網頁上透過複製copy貼上paste)來交換資訊,可說是現代人最離不開的電腦功能之一。

當然,除了文字能夠複製貼上外,當然我們也能夠存取圖片。不過在本文中,為求簡單清楚地範例,就只處理了文字內容。


範例程式碼

不同的作業系統所支援的剪貼簿處理套件並不相同,在 Linux 中我們可以使用 xclip 來做到存取系統剪貼簿的功能。

以下為 xclip 參數說明:

-selection: 由於系統剪貼簿存在複數個,所以我們需要選擇要使用的 clipboard。(對了,千萬不要使用過時的 Cut Buffers

-o: 從選擇的剪貼簿中讀取

Linux 版本

# coding: utf-8
import subprocess


def get_clipboard_data():
    p = subprocess.Popen(["xclip", "-selection", "clipboard", "-o"], stdout=subprocess.PIPE)
    retcode = p.wait()
    data = p.stdout.read()
    return data


def set_clipboard_data(data):
    data = bytes(data, "utf-8")
    p = subprocess.Popen(["xclip", "-selection", "clipboard"], stdin=subprocess.PIPE)
    p.stdin.write(data)
    p.stdin.close()
    retcode = p.wait()


if __name__ == "__main__":
    # our string data
    data = "Today is a nice day!"
    
    # Set the data
    set_clipboard_data(data)
    
    # Get the new data
    new_data = get_clipboard_data()
    
    # Print it out
    print(new_data)


Output:

b'This is a nice day!'




Mac OS

# coding: utf-8
import subprocess


def get_clipboard_data():
    p = subprocess.Popen(["pbpaste"], stdout=subprocess.PIPE)
    retcode = p.wait()
    data = p.stdout.read()
    return data


def set_clipboard_data(data):
    data = bytes(data, "utf-8")
    p = subprocess.Popen(["pbcopy"], stdin=subprocess.PIPE)
    p.stdin.write(data)
    p.stdin.close()
    retcode = p.wait()


if __name__ == "__main__":
    # our string data
    data = "Today is a nice day!"
    
    # Set the data
    set_clipboard_data(data)
    
    # Get the new data
    new_data = get_clipboard_data()
    
    # Print it out
    print(new_data)


Output:

b'This is a nice day!'



References


References

Tags:

Leave a Reply