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

How to fix Python 3 PyAutoGUI screenshot error? (macOS)

我总是在使用 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() 函数,我可以手动将其保存到项目中的真实目录中,但我无法使用其他方法来执行此操作。知道如何解决这个问题吗?

我尝试过的:

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

可能,非常 hack-ish 修复 - 我实际上不喜欢这个答案,但它是一个快速简单的修复(在 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 可能有点挑剔,因此即使这消除了您的错误,您仍然可能无法获得所需的坐标(可能 return none)。这可能与其他问题有关。为了测试那部分,我这样做:

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

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

在更改为 Python 3.8 后,我在 MacOS Mojave 上遇到了同样的问题。 这是我的解决方案。 转到@Richard W 提到的相同文件。 在那里,与所有 'imports' 一起添加以下行,以便脚本可以找到 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')))