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 的建议查看了 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
如果目标是从 WSL shell 获取 Windows 剪贴板内容,那么您可以通过 powershell(在 WSL 中可用)来实现:
powershell.exe Get-Clipboard
如果您尝试从 python 运行ning 中的 WSL 中访问它,那么您需要使用类似 subprocess.Popen() 到 运行 上面的命令。
如果您从 Ubuntu(来自 Windows 商店,请注意 20.04 可用)从旧 cmd.exe 开始(假定 %LOCALAPPDATA%\Microsoft\WindowsApps
在 PATH
中)通过
> 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()
相同的结果
我在 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 剪贴板。有解决办法吗?
我按照 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
如果目标是从 WSL shell 获取 Windows 剪贴板内容,那么您可以通过 powershell(在 WSL 中可用)来实现:
powershell.exe Get-Clipboard
如果您尝试从 python 运行ning 中的 WSL 中访问它,那么您需要使用类似 subprocess.Popen() 到 运行 上面的命令。
如果您从 Ubuntu(来自 Windows 商店,请注意 20.04 可用)从旧 cmd.exe 开始(假定 %LOCALAPPDATA%\Microsoft\WindowsApps
在 PATH
中)通过
> 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()
相同的结果