Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何读取复制到剪贴板Linux和MacOS中的文件的绝对路径?_Python_Linux_Macos - Fatal编程技术网

Python 如何读取复制到剪贴板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

通过下面的代码,我可以枚举剪贴板的内容。然后根据剪贴板格式根据剪贴板内容执行所需操作。这适用于Windows操作系统,但我不确定如何在Linux/MacOS上实现它

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所做的一些工作

  • get\u clipboard\u formats
    使用xclip获取剪贴板的可用格式内容
  • enum\u files\u从剪贴板
    clipboard处理以
    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)