【问题标题】:Pyperclip error on WSL2 running Ubuntu 18 LTS while trying to access data copied from windows运行 Ubuntu 18 LTS 的 WSL2 在尝试访问从 Windows 复制的数据时出现 Pyperclip 错误
【发布时间】:2020-12-11 19:24:35
【问题描述】:

我正在通过 Windows 10 build 20190 上的 Windows Terminal Preview (1.2.2234.0) 在 WSL2 中运行的 Ubuntu 18.04 上使用 IPython 7.16.1 (Python 3.7.7)(尽管问题不仅限于 IPython,它与壳本身)。我正在尝试对从 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 剪贴板。有解决办法吗?

我按照建议的herehere 看过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

【问题讨论】:

  • 请勿发布代码、数据、错误消息等的图片 - 将文本复制或输入到问题中。 How to Ask
  • @Rob 没有要发布的数据,我的代码是 pandas.read_clipboard() ,我已经指定了。如果您需要文本中的堆栈跟踪,我可以添加它,但看不出有什么帮助。
  • @SayandipDutta 他的意思是堆栈跟踪。作为文本而不是图像更容易阅读和使用,通常不使用图像来表示任何类型的文本是一种好习惯。

标签: python ubuntu windows-subsystem-for-linux pyperclip windows-terminal


【解决方案1】:

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

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

在 Windows 中将一些结构化数据复制到剪贴板后

import pandas as pd
import pyperclip

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

这给出了与 pd.read_clipboard() 相同的结果

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 太棒了!你是怎么想出来的?我查看了这段代码,从来没有想过这个。
    • 好吧,我注意到 pyperclip 工作正常,所以我认为这是 pandas 代码中的一个错误,检查将我带到了那一行。仅供参考 - 我已经向 pandas 提交了 PR,但它可能需要一段时间才能发布。 github.com/pandas-dev/pandas/pull/38546
    【解决方案3】:

    如果您从旧的 cmd.exe(假设 %LOCALAPPDATA%\Microsoft\WindowsAppsPATH 中)通过

    启动 Ubuntu(从 Windows 应用商店,注释 20.04 可用)
        > start ubuntu1804
    

    (如果没有start,您将留在 cmd.exe 中——可能但不推荐。)它在 Linux 终端中运行 Ubuntu。 在那里跑步(最好在 venv 中)

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

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

    注意橙色的 Ubuntu 图标:

    【讨论】:

    • 哇!这对你有用!它给了我同样的错误?
    • 在 ubuntu 终端中从 cmd.exe wirh start ubuntu1804 启动? (我无法尝试 Windows Terminal,因为我的 Win10 版本不够用)。
    • 那么我会从 Windows Store 尝试 Ubuntu 20.04。
    • 升级了,同样的问题。
    【解决方案4】:

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

    powershell.exe Get-Clipboard
    

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

    【讨论】:

    • 谢谢。我知道这一点,不知道如何使它适用于这个特定的用例。 pd.read_clipboard() 真的很方便(尽管我可以不用它),如果我能以某种方式让它工作,那就太好了。
    • 所以你的问题真的是如何给熊猫打补丁?您对提供剪贴板内容的 pd.read_clipboard() 死心了吗?有什么特别的原因吗?
    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 2019-12-05
    • 1970-01-01
    • 2017-04-08
    • 2012-07-26
    • 1970-01-01
    相关资源
    最近更新 更多