WindowsからコピーされたデータにアクセスしようとしたときにUbuntu18LTSを実行しているWSL2でPyperclipエラーが発生しました

Aug 23 2020

Windows10ビルド20190のWindowsターミナルプレビュー(1.2.2234.0)を介してWSL2で実行されているUbuntu18.04でIPython7.16.1(Python 3.7.7)を使用しています(問題はIPythonに限定されていませんが、シェル自体にあります) 。pandas.read_clipboard()Windowsからコピーしたデータ、つまり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クリップボードにアクセスできるメカニズムが必要です。これに対する解決策はありますか?

私が見てきました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

回答

1 Maksim Dec 17 2020 at 02:26

この問題は、次のコードブロックに関係していることに気付きました:pandas / io / clipboard / init .py#L523-L526

行を編集し、if "Microsoft" in f.read():「Microsoft」を「microsoft」(小文字の「m」)に置き換えると、クリップボード機能が機能します。

良い長期的な解決策ではありませんが、パンダチームがこれを統合するまでは間違いなく簡単なパッチです。

1 thoku Aug 27 2020 at 21:51

Ubuntuを起動する場合は古き良きcmd.exeのから(Windowsストアから、ノート20.04で利用可能です)(与えられ%LOCALAPPDATA%\Microsoft\WindowsAppsているPATH経由)

    > start ubuntu1804

startcmd.exeにとどまる必要はありません。可能ですが、お勧めできません。)LinuxターミナルでUbuntuを実行します。そこで実行する(venvで最適)

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

動作するはずです。つまり、クリップボードのコンテンツを印刷します。同様に、コピーしてWindowsに貼り付けることができます。

オレンジ色のUbuntuアイコンに注意してください。

kerasbaz Aug 26 2020 at 01:21

目標がWSLシェルからWindowsクリップボードの内容を取得することである場合は、PowerShell(WSLで利用可能)を介してそれを行うことができます。

powershell.exe Get-Clipboard

WSLで実行されているPython内からこれにアクセスしようとしている場合は、subprocess.Popen()などを使用して上記のコマンドを実行する必要があります。