【问题标题】:How to fix Python 3 PyAutoGUI screenshot error? (macOS)如何修复 Python 3 PyAutoGUI 屏幕截图错误? (苹果系统)
【发布时间】: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 软件。一定是这样,好洞察力!

标签: python-3.x macos crash screenshot pyautogui


【解决方案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')))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      • 2021-04-24
      • 2022-08-11
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多