如何修复 Python 3 PyAutoGUI 屏幕截图错误? (苹果系统)

Posted

技术标签:

【中文标题】如何修复 Python 3 PyAutoGUI 屏幕截图错误? (苹果系统)【英文标题】:How to fix Python 3 PyAutoGUI screenshot error? (macOS) 【发布时间】:2019-03-14 19:25:44 【问题描述】:

我在使用 PyAutoGUI 的任何屏幕截图功能时都会遇到错误,例如:

pyautogui.locateOnScreen('button.png')
pyautogui.pixelMatchesColor(x, y, (r, g, b))
im = pyautogui.screenshot()

我得到的错误是:

screencapture: cannot write file to intended destination, .screenshot2018-1009_16-43-26-003190.png
Traceback (most recent call last):
  File "~/program.py", line 111, in <module>
    pyautogui.locateOnScreen('/images/play!.png')
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyscreeze/__init__.py", line 265, in locateOnScreen
    screenshotIm = screenshot(region=None) # the locateAll() function must handle cropping to return accurate coordinates, so don't pass a region here.
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyscreeze/__init__.py", line 331, in _screenshot_osx
    im = Image.open(tmpFilename)
  File "/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PIL/Image.py", line 2609, in open
    fp = builtins.open(filename, "rb")
FileNotFoundError: [Errno 2] No such file or directory: '.screenshot2018-1009_16-43-26-003190.png'

我不告诉它也不希望它将新的截图图像保存到任何目录(它不应该)。使用 pyautogui.screenshot() 函数,我可以手动将其保存到项目中的真实目录中,但我无法使用其他方法来执行此操作。关于如何解决这个问题的任何想法?

我尝试过的:

我查看了所有可以在网上找到的有关 pyautogui 屏幕截图的文档 重新启动计算机 Pillow 和 pyscreez 的降级版本

编辑: 我在另一台 Mac 上尝试过,也遇到了同样的错误。 在 windows bootcamp(我的 mac 上的 windows)上试过,效果很好。

【问题讨论】:

同样的问题..你找到答案了吗? @Otto 遗憾的是我没有。我必须在 Windows 上进行这种编程。我想知道是否有很多 mac 用户遇到这个问题,因为我已经在不同的 mac 上尝试过,但仍然出现错误。我猜这是一个将来会修复的错误。祝你好运! 您使用的是哪个版本的 osx?这适用于 High Sierra,但在我升级到 Mojave 后就坏了。 Mojave 对屏幕截图进行了一些更改,所以我想知道这是否相关。 @RichardW 是的,我测试过的所有 Mac 电脑都安装了 Mojave 软件。一定是这样,好洞察力! 【参考方案1】:

可能的,非常黑客式的修复 - 我实际上并不喜欢这个答案,但它是一个快速简单的修复(在 OSX 上使用 Mojave 完成):

请注意:修改您不理解的库的源代码通常是个坏主意,因此请自行承担风险!这对我有用,你的里程可能会有所不同。

转到您的文件(您的文件路径可能不同,我只是从您的错误中复制了这个):

/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/pyscreeze/__init__.py

在函数“_screenshot_osx”下找到类似的行

tmpFilename = '.screenshot%s.png' % (datetime.datetime.now().strftime('%Y-%m%d_%H-%M-%S-%f'))

复制它然后将其注释掉,将复制的行直接粘贴在注释掉的原始下面并修改为如下内容:

tmpFilename = r'<your preferred screenshot folder here>/screenshot%s.png' % (datetime.datetime.now().strftime('%Y-%m%d_%H-%M-%S-%f'))

保存更改,看看是否有效。

另请注意:pyautogui.locateOnScreen 可能有点挑剔,因此即使这消除了您的错误,您仍然可能无法获得所需的坐标(可能不会返回)。这可能与另一个问题有关。为了测试那部分,我这样做:

import pyautogui
pyautogui.screenshot('testFull.png')
placePos = pyautogui.locateOnScreen('testFull.png')
print(placePos)

即使是光标闪烁也会把这搞砸,而且 osx 有半透明的用户界面,所以在没有仔细的图像管理的情况下完美地测试它有点烦人。

【讨论】:

【参考方案2】:

在更改为 Python 3.8 后,我在 MacOS Mojave 上遇到了同样的问题。 这是我的解决方案。 转到@Richard W 提到的同一个文件。 在那里,连同所有“导入”,添加以下行,以便脚本可以找到 tmpFilename 文件夹

dirname = os.path.dirname(__file__)

然后,将同样提到的行替换为

tmpFilename = os.path.join(dirname,r'screenshot%s.png' % (datetime.datetime.now().strftime('%Y-%m%d_%H-%M-%S-%f')))

【讨论】:

以上是关于如何修复 Python 3 PyAutoGUI 屏幕截图错误? (苹果系统)的主要内容,如果未能解决你的问题,请参考以下文章

Python自动操作 GUI 神器——PyAutoGUI

python实现自动点赞

Python PyAutoGUI错误提示求解?

Python pyautogui分辨率不同造成的图片定位与鼠标位置不一致的解决方法

屏幕截图小工具的制作过程问题记录 python PIL pynput pyautogui pyscreeze

CTRL+V 在 PyAutoGUI、Windows 上的 Python 3 中不起作用