WSL2 运行 Ubuntu 18 LTS 上的 Pyperclip 错误,同时尝试访问从 windows 复制的数据

Pyperclip error on WSL2 running Ubuntu 18 LTS while trying to access data copied from windows

我在 Ubuntu 18.04 运行 上使用 IPython 7.16.1 (Python 3.7.7) Windows 终端预览 (1.2 .2234.0) 在 Windows 10 build 20190 上(尽管问题不限于 IPython,它与 shell 本身有关)。我正在尝试对从 Windows 复制的数据使用 pandas.read_clipboard(),即在 WSL 之外。但是,出现以下错误:

PyperclipException:
    Pyperclip could not find a copy/paste mechanism for your system.
    For more information, please visit
    https://pyperclip.readthedocs.io/en/latest/introduction.html#not-implemented-error

我知道这是因为 WSL 不支持显示,但是,因为我可以将粘贴数据复制到 WSL 和 Windows,所以应该有一种机制可以让我访问 windows 剪贴板。有解决办法吗?

我按照 , and here 的建议查看了 xclipxselQTpy,但没有帮助。

完整堆栈跟踪:

In [1]: import pandas as pd
In [2]: df = pd.read_clipboard()
---------------------------------------------------------------------------
PyperclipException                        Traceback (most recent call last)
<ipython-input-2-861af318b71b> in <module>
----> 1 df = pd.read_clipboard()

~/anaconda3/envs/tensorflow_gpu/lib/python3.7/site-packages/pandas/io/clipboards.py in read_clipboard(sep, **kwargs)
     36     from pandas.io.parsers import read_csv
     37
---> 38     text = clipboard_get()
     39
     40     # Try to decode (if needed, as "text" might already be a string here).

~/anaconda3/envs/tensorflow_gpu/lib/python3.7/site-packages/pandas/io/clipboard/__init__.py in lazy_load_stub_paste()
    648     global copy, paste
    649     copy, paste = determine_clipboard()
--> 650     return paste()
    651
    652

~/anaconda3/envs/tensorflow_gpu/lib/python3.7/site-packages/pandas/io/clipboard/__init__.py in __call__(self, *args, **kwargs)
    285     class ClipboardUnavailable:
    286         def __call__(self, *args, **kwargs):
--> 287             raise PyperclipException(EXCEPT_MSG)
    288
    289         def __bool__(self) -> bool:

PyperclipException:
    Pyperclip could not find a copy/paste mechanism for your system.
    For more information, please visit
    https://pyperclip.readthedocs.io/en/latest/introduction.html#not-implemented-error

如果目标是从 WSL shell 获取 Windows 剪贴板内容,那么您可以通过 powershell(在 WSL 中可用)来实现:

powershell.exe Get-Clipboard

如果您尝试从 python 运行ning 中的 WSL 中访问它,那么您需要使用类似 subprocess.Popen() 到 运行 上面的命令。

如果您从 Ubuntu(来自 Windows 商店,请注意 20.04 可用)从旧 cmd.exe 开始(假定 %LOCALAPPDATA%\Microsoft\WindowsAppsPATH 中)通过

    > start ubuntu1804

(w/o start 你会留在 cmd.exe——可能但不推荐。)它在 Linux 终端运行 Ubuntu。 运行 那里(最好的)

    (venv) > pip install pyperclip
    (venv) > python -c "import pyperclip; print(pyperclip.paste())"

应该可以,即打印您的剪贴板内容。 同样,我可以复制/粘贴回 Windows.

注意橙色 Ubuntu 图标:

我注意到问题与以下代码块有关:pandas/io/clipboard/init.py#L523-L526

如果我编辑行 if "Microsoft" in f.read():,并将“Microsoft”替换为“microsoft”(小写的“m”),那么剪贴板功能对我有用。

这不是一个好的长期解决方案,但绝对是一个简单的补丁,直到 pandas 个团队集成它。

截至今天,运行 Pandas 1.2.3 这仍然是一个问题。

我正在使用的一个简单解决方法可能对其他人有帮助:

在Windows

中将一些结构化数据复制到剪贴板后
import pandas as pd
import pyperclip

pd.read_csv(io.StringIO(pyperclip.paste()), sep='\t')

这给出了与 pd.read_clipboard()

相同的结果