如何用python實現復制粘貼功能
楔子
pandas裡面有這麼一個方法:pd.read_clipboard,可以根據你復制的內容生成DataFrame。是的,就是我們平時選中,然後復制、或者Ctrl+C時拷貝的內容,所以比較神奇,那麼pandas到底是怎麼做到的,它是怎麼讀出我們使用Ctrl +C復制的內容呢。
看瞭一下源碼,非常的復雜,方法是使用瞭ctypes,然後調用瞭操作系統的一個動態庫實現的。ctypes是專門來調用C、C++使用的,但是我們知道Python有一個pywin32模塊,對於Windows操作系統提供的接口進行瞭封裝。所以下面我們使用pywin32來實現我們平時使用的復制粘貼功能。
首先是安裝:pip install pywin32
。
實現復制
下面我們來看看如何使用這個模塊實現復制功能,另外關於pywin32這個模塊,它的傢族非常的龐大。
裡面有很多的win32xxx.pyd,我們直接調用就行。
# win32clipboard專門用來復制粘貼的 import win32clipboard as wcb import win32con as wc # 打開復制粘貼板 wcb.OpenClipboard() # 我們之前可能已經Ctrl+C瞭,這裡是清空目前Ctrl+C復制的內容。但是經過測試,這一步即使沒有也無所謂 wcb.EmptyClipboard() # 將內容寫入復制粘貼板,第一個參數win32con.CF_TEXT不用管,我也不知道它是幹什麼的 # 關鍵第二個參數,就是我們要復制的內容,一定要傳入字節 wcb.SetClipboardData(wc.CF_TEXT, "古明地覺世界第一可愛".encode("gbk")) # 關閉復制粘貼板 wcb.CloseClipboard()
然後我們 Ctrl+V 粘貼就會得到 “古明地覺世界第一可愛” 這個字符串,再強調一次,這裡不能傳入字符串、而是要傳入字節。如果傳入字符串,那麼中文會得到亂碼、ascii文本隻會得到第一個字符。
另外這裡要使用 gbk,因為我當前操作系統默認編碼使用的是gbk,所以會對我們輸入的字節使用 gbk 解碼。因此如果使用utf-8編碼的話,那麼粘貼得到的依舊是亂碼。當然具體根據你當前的機器決定。
實現粘貼
復制我們實現瞭,下面來看看怎麼實現粘貼。
# win32clipboard專門用來復制粘貼的 import win32clipboard as wcb import win32con as wc # 打開復制粘貼板 wcb.OpenClipboard() # 獲取粘貼板內容,既然是獲取,那麼隻需要一個參數即可。 # 會返回已經使用Ctrl+C復制得到的內容 data = wcb.GetClipboardData(wc.CF_TEXT) # 關閉復制粘貼板 wcb.CloseClipboard() # 得到的依舊是字節 """ 我們在"實現復制"的時候說過,因為Ctrl+V默認使用gbk解碼,所以在模擬Ctrl+C的時候我們也要傳入使用gbk編碼的字符串 那麼在"實現粘貼"的時候也是一樣,我們使用Ctrl+C復制的時候,也會使用gbk編碼成字節 那麼這裡模擬Ctrl+V得到字節之後也要使用gbk解碼 """ # 然後隨便Ctrl+C拷貝一段內容,下面就會將拷貝的內容打印出來 print(data.decode("gbk"))
我們上面的模塊是win32傢族,所以它隻適用於Windows系統,不適用於Linux和macOS。那麼如果我想在Linux和macOS中實現怎麼辦呢?也很簡單,事實上,這兩個系統實現起來反而會更簡單,因為自帶瞭相關的命令。
macOS實現復制粘貼
import subprocess # 實現拷貝 def copy(text): p = subprocess.Popen(["pbcopy", "w"], stdin=subprocess.PIPE, close_fds=True) # 將內容(text)拷貝起來 p.communicate(input=text.encode("utf-8")) # 實現粘貼 def paste(): p = subprocess.Popen(["pbpaste", "r"], stdout=subprocess.PIPE, close_fds=True) stdout, stderr = p.communicate() #返回粘貼內容 return stdout.decode("utf-8")
Linux實現復制粘貼
註意:Linux上實現復制粘貼實際上意義不大,因為實現復制粘貼的功能的一個前提是你必須要有顯示器。
而公司使用的服務器肯定不會帶顯示器的,使用的時候都是通過xshell遠程連接。但是Linux上也提供瞭相應的命令,叫xclip,當然這個命令不是自帶的,使用的時候可能還要安裝:yum install xclip。下面來看看怎麼通過 Python 調用,實際上和macOS一樣。
import subprocess # 實現拷貝 def copy(text): p = subprocess.Popen( ["xclip", "-selection", "c"], stdin=subprocess.PIPE, close_fds=True ) p.communicate(input=text.encode("utf-8")) # 實現粘貼 def paste(): p = subprocess.Popen( ["xclip", "-selection", "c", "-o"], stdout=subprocess.PIPE, close_fds=True ) stdout, stderr = p.communicate() return stdout.decode("utf-8")
可以看到Linux和macOS還是比較簡單的,因為操作系統提供瞭這個命令,我們可以直接使用。但是Windows則沒有提供,所以需要使用ctypes,或者使用封裝好的pywin32。
另外還是那句話,Linux上執行需要有顯示器,我以我阿裡雲上的centos為例。
提示我們無法打開顯示器,因為根本就沒有。 當然,感覺這個功能也沒多大用,當做興趣瞭解一下就行。
以上就是如何用python實現復制粘貼功能的詳細內容,更多關於python實現復制粘貼功能的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- Python中使用subprocess庫創建附加進程
- python中subprocess實例用法及知識點詳解
- Python移動測試開發subprocess模塊項目實戰
- Python實現系統交互(subprocess)
- Python使用shutil操作文件、subprocess運行子程序