Python 如何读取复制到剪贴板Linux和MacOS中的文件的绝对路径?
通过下面的代码,我可以枚举剪贴板的内容。然后根据剪贴板格式根据剪贴板内容执行所需操作。这适用于Windows操作系统,但我不确定如何在Linux/MacOS上实现它Python 如何读取复制到剪贴板Linux和MacOS中的文件的绝对路径?,python,linux,macos,Python,Linux,Macos,通过下面的代码,我可以枚举剪贴板的内容。然后根据剪贴板格式根据剪贴板内容执行所需操作。这适用于Windows操作系统,但我不确定如何在Linux/MacOS上实现它 xclip似乎是Linux最受支持的选项 xclip-o-t目标公开剪贴板mime类型。但是,我没有看到与win32clipboard.CF_HDROP等价的方法来检索复制到剪贴板的文件的绝对路径 def get_剪贴板_格式(): ''' 返回剪贴板中当前所有数据格式的列表 ''' 格式=[] 如果sys.platform.sta
xclip
似乎是Linux最受支持的选项
xclip-o-t目标
公开剪贴板mime类型。但是,我没有看到与win32clipboard.CF_HDROP
等价的方法来检索复制到剪贴板的文件的绝对路径
def get_剪贴板_格式():
'''
返回剪贴板中当前所有数据格式的列表
'''
格式=[]
如果sys.platform.startswith('win'):
导入win32clipboard#pylint:disable=导入错误
f=win32clipboard.EnumClipboardFormats(0)
而f:
格式。追加(f)
f=win32clipboard.EnumClipboardFormats(f)
返回格式
其他:
打印(“获取剪贴板格式:未针对操作系统实现”)
def get_selected_文件(folders=False):
'''
将所选内容(随后感兴趣的文本或文件)复制到新的剪贴板
'''
如果sys.platform.startswith('win'):
cb=剪贴板(从系统=真)
cb.清除剪贴板()
键(“c-c”).execute()
睡眠时间(0.1)
文件=获取\u剪贴板\u文件(文件夹)
cb.将_复制到_系统()
返回文件
其他:
打印(“获取所选文件:未为操作系统实现”)
def get_剪贴板_文件(文件夹=False):
'''
枚举剪贴板内容并返回直接复制或复制的文件
已复制高亮显示的路径
'''
如果sys.platform.startswith('win'):
导入win32clipboard#pylint:disable=导入错误
文件=无
win32clipboard.OpenClipboard()
f=获取剪贴板格式()
如果f中的win32clipboard.CF_HDROP:
files=win32clipboard.GetClipboardData(win32clipboard.CF\u HDROP)
elif win32clipboard.CF_UNICODETEXT在f中:
files=[win32clipboard.GetClipboardData(win32clipboard.CF\u unicodext)]
elif win32clipboard.CF_f中的文本:
files=[win32clipboard.GetClipboardData(win32clipboard.CF\u TEXT)]
elif win32clipboard.CF_f中的OEMTEXT:
files=[win32clipboard.GetClipboardData(win32clipboard.CF\u OEMTEXT)]
如果文件夹:
files=[f表示文件中的f,如果是os.path.isdir(f)],如果是其他文件,则为无
其他:
files=[f表示文件中的f,如果是os.path.isfile(f)],如果是其他文件,则为无
win32clipboard.CloseClipboard()
返回文件
其他:
打印(“获取剪贴板文件:未为操作系统实现”)
编辑:以下是我使用xclip为Linux所做的一些工作
使用xclip获取剪贴板的可用格式内容get\u clipboard\u formats
clipboard处理以enum\u files\u从剪贴板
或通用输出行开始的内容。然后通过处理未验证的绝对文件/文件夹路径生成列表file://
根据可用内容调用get_clipboard_files
。然后有效地模拟enum_files_from_clipboard
win32clipboard.CF\u HDROP
get\u clipboard\u files(folders=False)
或true
调用该函数。然后确保剪贴板中有文件/文件夹
我承认它可以更干净一点,但为了清楚起见
from locale import getpreferredencoding
import sys, os, subprocess
from six import binary_type
try:
from urllib import unquote
except ImportError:
from urllib.parse import unquote
def get_clipboard_formats():
'''
Return list of all data formats currently in the clipboard
'''
formats = []
if sys.platform.startswith('linux'):
encoding = getpreferredencoding()
com = ["xclip", "-o", "-t", "TARGETS"]
try:
p = subprocess.Popen(com,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
)
for line in iter(p.stdout.readline, b''):
if isinstance(line, binary_type):
line = line.decode(encoding)
formats.append(line.strip())
except Exception as e:
print("Exception from starting subprocess {0}: " "{1}".format(com, e))
if sys.platform.startswith('win'):
import win32clipboard # pylint: disable=import-error
f = win32clipboard.EnumClipboardFormats(0)
while f:
formats.append(f)
f = win32clipboard.EnumClipboardFormats(f)
if not formats:
print("get_clipboard_formats: formats are {}: Not implemented".format(formats))
else:
#print(formats)
return formats
def enum_files_from_clipboard(mime):
'''
Generates absolute paths from clipboard
Returns unverified absolute file/dir paths based on defined mime type
'''
paths = []
if sys.platform.startswith('linux'):
encoding = getpreferredencoding()
com = ["xclip", "-selection", "clipboard","-o", mime]
try:
p = subprocess.Popen(com,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
stdin=subprocess.PIPE,
)
for line in iter(p.stdout.readline, b''):
if isinstance(line, binary_type):
line = line.decode(encoding).strip()
if line.startswith("file://"):
paths.append(unquote(line.replace("file://", "")))
else:
paths.append(unquote(line)) # Will append line which will be checked against isfile\isdir
#print(paths)
return paths
except Exception as e:
print("Exception from starting subprocess {0}: " "{1}".format(com, e))
def get_clipboard_files(folders=False):
'''
Enumerate clipboard content and return files/folders either directly copied or
highlighted path copied
'''
files = None
if sys.platform.startswith('win'):
import win32clipboard # pylint: disable=import-error
win32clipboard.OpenClipboard()
f = get_clipboard_formats()
if win32clipboard.CF_HDROP in f:
files = win32clipboard.GetClipboardData(win32clipboard.CF_HDROP)
elif win32clipboard.CF_UNICODETEXT in f:
files = [win32clipboard.GetClipboardData(win32clipboard.CF_UNICODETEXT)]
elif win32clipboard.CF_TEXT in f:
files = [win32clipboard.GetClipboardData(win32clipboard.CF_TEXT)]
elif win32clipboard.CF_OEMTEXT in f:
files = [win32clipboard.GetClipboardData(win32clipboard.CF_OEMTEXT)]
if folders:
files = [f for f in files if os.path.isdir(f)] if files else None
else:
files = [f for f in files if os.path.isfile(f)] if files else None
win32clipboard.CloseClipboard()
print(files)
return files
if sys.platform.startswith('linux'):
f = get_clipboard_formats()
if "UTF8_STRING" in f:
files = enum_files_from_clipboard("UTF8_STRING")
elif "TEXT" in f:
files = enum_files_from_clipboard("TEXT")
elif "text/plain" in f:
files = enum_files_from_clipboard("text/plain")
if folders:
files = [f for f in files if os.path.isdir(str(f))] if files else None
else:
files = [f for f in files if os.path.isfile(str(f))] if files else None
print(files)
return files
#get_clipboard_files(folders=True)