如何修复 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() 函数,我可以手动将其保存到项目中的真实目录中,但我无法使用其他方法来执行此操作。知道如何解决这个问题吗?
我尝试过的:
- 我查看了所有我能在网上找到的 pyautogui 屏幕截图的文档
- 正在重启计算机
- Pillow 和 pyscreeze 的降级版本
编辑:
我在另一个 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')))
我总是在使用 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 和 pyscreeze 的降级版本
编辑: 我在另一个 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')))