我主要使用 Windows,其中运行 WSL2。因此,从子系统中运行的 python 脚本中,我想截取 Windows 监视器上的所有内容,就像这样简单:
v1
import mss
import os
os.environ['DISPLAY'] = ':0'
with mss.mss() as sct:
sct.shot()
这只会给出“分段错误”错误并且没有图像。因此,我尝试在 Windows 中设置 vcxsrv,并且可以通过服务器从 Windows 中的子系统打开内容,但是我无法以相反的方式获得它..
我只想访问 Windows 屏幕,这样我就可以截图它。任何有关如何通过 wsl 访问监视器的帮助将不胜感激,我在谷歌上找不到太多。
很不幸,你不能直接用 mss 库从 WSL 发起截屏 Windows 桌面的操作。这是因为 mss 依赖于与显示服务器的直接连接来捕捉屏幕内容,而 WSL 环境与 Windows 显示服务器运行在不同的内核和图形堆栈上。
为了实现你的目标,你可以考虑以下几种方法:
1. 使用 Windows 上运行的截图工具,并通过 WSL 调用:
-
你可以使用 Python 的
subprocess
模块从 WSL 中调用 Windows 上的截图工具,例如:-
Snipping Tool:
subprocess.run(["snippingtool", "/clip"])
将截取屏幕并保存到剪贴板。 - ShareX: 安装 ShareX 并使用命令行选项来自定义截图操作。
-
Snipping Tool:
- 你需要找到适合你需求的 Windows 截图工具,并参考其文档了解如何通过命令行使用。
2. 使用网络传输截图数据:
- 你可以编写一个简单的 Python 脚本,使用 Windows 上的截图库(例如 pyautogui 或 Pillow )截取屏幕,并将图像数据通过网络发送到 WSL。
-
在 WSL 中,你可以使用 Python 的
socket
模块接收图像数据并保存为文件。
3. 使用远程桌面协议 (RDP) 库:
- 你可以使用 Python 的 RDP 库(例如 rdp 或 mrdp )连接到 Windows 并截取远程桌面会话的屏幕截图。
- 这种方法需要你在 Windows 上启用远程桌面连接。
以下是一个使用 pyautogui 在 Windows 上截屏并将图像数据通过网络发送到 WSL 的示例:
Windows 端 (server.py):
import socket
import pyautogui
HOST = '127.0.0.1' # 你的 WSL IP 地址
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind((HOST, PORT))
s.listen()
conn, addr = s.accept()
with conn:
print(f"Connected by {addr}")
screenshot = pyautogui.screenshot()
screenshot.save("screenshot.png")
with open("screenshot.png", "rb") as f:
data = f.read()
conn.sendall(data)
WSL 端 (client.py):
import socket
HOST = '127.0.0.1' # Windows 的 IP 地址
PORT = 65432
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
with open("received_screenshot.png", "wb") as f:
while True:
data = s.recv(1024)
if not data:
break
f.write(data)
print("Screenshot received successfully!")
请根据你的实际情况选择最合适的方法。
标签:python,screenshot,windows-subsystem-for-linux,monitor From: 71087163