WindowsからコピーされたデータにアクセスしようとしたときにUbuntu18LTSを実行しているWSL2でPyperclipエラーが発生しました
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クリップボードにアクセスできるメカニズムが必要です。これに対する解決策はありますか?
私が見てきましたxclip
、xsel
、QTpy
示唆されているようにここでは、とここでは、助けにはなりませんでした。
フルスタックトレース:
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
回答
この問題は、次のコードブロックに関係していることに気付きました:pandas / io / clipboard / init .py#L523-L526
行を編集し、if "Microsoft" in f.read():
「Microsoft」を「microsoft」(小文字の「m」)に置き換えると、クリップボード機能が機能します。
良い長期的な解決策ではありませんが、パンダチームがこれを統合するまでは間違いなく簡単なパッチです。
Ubuntuを起動する場合は古き良きcmd.exeのから(Windowsストアから、ノート20.04で利用可能です)(与えられ%LOCALAPPDATA%\Microsoft\WindowsApps
ているPATH
経由)
> start ubuntu1804
(start
cmd.exeにとどまる必要はありません。可能ですが、お勧めできません。)LinuxターミナルでUbuntuを実行します。そこで実行する(venvで最適)
(venv) > pip install pyperclip
(venv) > python -c "import pyperclip; print(pyperclip.paste())"
動作するはずです。つまり、クリップボードのコンテンツを印刷します。同様に、コピーしてWindowsに貼り付けることができます。
オレンジ色のUbuntuアイコンに注意してください。

目標がWSLシェルからWindowsクリップボードの内容を取得することである場合は、PowerShell(WSLで利用可能)を介してそれを行うことができます。
powershell.exe Get-Clipboard
WSLで実行されているPython内からこれにアクセスしようとしている場合は、subprocess.Popen()などを使用して上記のコマンドを実行する必要があります。