pyautogui.locateOnScreen(img_path) funktioniert nicht

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Baustein
User
Beiträge: 8
Registriert: Montag 29. November 2021, 17:27

Moin Python-User,

ich bin noch etwas unerfahren und nutze python 3.8.10 auf Windows 10. Ich habe folgende pip installationen über die cmd ausgeführt:

pip install pywin32
pip install keyboard
pip install pyautogui
pip install opencv-python

Ich habe mein Skript soweit fertig geschrieben und wenn die Funktion pyautogui.locateOnScreen(img_path) aufgerufen wird, dann kommt die unten aufgelistete Fehlermeldung.
Ich würde gerne wissen, woran das Problem genau liegt. Kann mir dabei jemand weiterhelfen?

--FEHLERMELDUNG--

Traceback (most recent call last):
File "D:\User\Python\Install\python_scripts\Flüge\skript\gui_handler.py", line 153, in <module>
pyautogui.locateOnScreen('D:/User/Python/Flüge/pictures/firefox.PNG',confidence=0.9)
File "D:\User\Python\Install\lib\site-packages\pyautogui\__init__.py", line 175, in wrapper
return wrappedFunction(*args, **kwargs)
File "D:\User\Python\Install\lib\site-packages\pyautogui\__init__.py", line 213, in locateOnScreen
return pyscreeze.locateOnScreen(*args, **kwargs)
File "D:\User\Python\Install\lib\site-packages\pyscreeze\__init__.py", line 373, in locateOnScreen
retVal = locate(image, screenshotIm, **kwargs)
File "D:\User\Python\Install\lib\site-packages\pyscreeze\__init__.py", line 353, in locate
points = tuple(locateAll(needleImage, haystackImage, **kwargs))
File "D:\User\Python\Install\lib\site-packages\pyscreeze\__init__.py", line 207, in _locateAll_opencv
needleImage = _load_cv2(needleImage, grayscale)
File "D:\User\Python\Install\lib\site-packages\pyscreeze\__init__.py", line 170, in _load_cv2
raise IOError("Failed to read %s because file is missing, "
OSError: Failed to read D:/User/Python/Flüge/pictures/firefox.PNG because file is missing, has improper permissions, or is an unsupported or invalid format
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na da steht doch unten was das Problem ist - er findet die Datei firefox.png nicht. Gibt es die da, wo er sie sucht?
Baustein
User
Beiträge: 8
Registriert: Montag 29. November 2021, 17:27

@ __deets__
Ja die Datei gibt es da, wo er sie sucht. Ich habe den Pfad händisch eingetragen und lasse ihn sowohl über das glob-Modul suchen. Und im Ordner befindet sich die gewünschte Datei.

Den Screenshot habe ich über Snippingtool gemacht und als png abgespeichert. es ist einfach nur das Firefox-icon unten Windows Taskleiste.

Wie kann ich das Problem beheben?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Außer die Datei an die Stelle zu legen, oder den Pfad zur Datei zu korrigieren - nichts. Denn das passt nicht zusammen, so ist es eben. Normalerweise ist der Pfad übrigens C:/Users. Mit s.
Baustein
User
Beiträge: 8
Registriert: Montag 29. November 2021, 17:27

Jo, ich habe meinen Namen für dieses Forum herausgenommen und durch User ersetzt.

Also kann ich den Fehler nicht beheben?

Ich hätte mal nach gelesen, dass das Pillow package nicht mehr Bilder importieren kann. Ist das korrekt? Kann es an den Paketen liegen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke nicht, dass es an den Paketen liegt.
Baustein
User
Beiträge: 8
Registriert: Montag 29. November 2021, 17:27

Am Pfad kann es aber nicht liegen. Ich kann dir gern den Skriptschnipsel schicke, indem ich mir den dateipfad raussuche. Am Pfad sollte es definitiv nicht liegen.

Vor ca. einem Jahr hat das Skript unter einer anderen Python Version funktioniert.

Warum sollte es jetzt nicht mehr funktionieren? Warum sollten die Dateien jetzt ein nicht unterstütztes Format oder eine falsche Berechtigung aufweisen?
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich kann dir nur sagen, was die Fehlermeldung sagt. Die kommt von hier https://github.com/asweigart/pyscreeze/ ... __.py#L169

Wenn ist es ein OpenCV-Problem, wie man da sieht. Das die aber keine PNG-Dateien laden können, kann ich mir schwer vorstellen.

Was ergibt denn ein

open(pfad, “rb”).read()

mit dem gleichen Pfad? Das umgeht alle Bibliotheken & zeigt, ob der Zugriff an sich geht.
Baustein
User
Beiträge: 8
Registriert: Montag 29. November 2021, 17:27

pic = open(r'D:\Users\Python\Flüge\skript\pictures\firefox.png',"rb").read()
print(pic)

Ausgabe:
b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00 ............... \x00\x00IEND\xaeB`\x82'


Der Zugriff funktioniert.
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann ist es OpenCV. Musst du mal googeln, warum das keine PNGs lesen könnte. Früher auf jeden Fall konnte es keinen Alpha Kanal.
Baustein
User
Beiträge: 8
Registriert: Montag 29. November 2021, 17:27

Ich habe ein für mich komisches Verhalten fest gestellt.

Ich habe einen Skript-Ordner
- Ordner "Eigene Python skripte"
- Dateien "Skript"
- Ordner "Pictures"

Wenn ich die Bilder aus Ordner "Pictures" lade, dann zeigt mir die folgende Methode:
import cv2
im = cv2.imread(path)
print(im)

None an

Wenn ich ein anderes Dateiverzeichnis, was nichts mit "Eigene Python Skripte" zu tun hat, dann kommt bei dem Print-Befehl ein numpy-array.
Darauf versuche ich jetzt auf zu bauen.
Benutzeravatar
__blackjack__
User
Beiträge: 13079
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Baustein: Was denn nun "Eigene Python skripte" oder "Eigene Python Skripte"? Ja, ich weiss, Windows ist das egal, aber eventuell nicht jeder Software die darauf läuft und nicht Windows-Only ist.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das klingt nach einem Windows Rechteproblem. Das hat ja eine Vielzahl von solchen Ecken, da sieht dann ein Prozess bestimmte Verzeichnisse nicht und was weiß ich. Wobei das es dann wieder nur opencv betrifft komisch ist.
Baustein
User
Beiträge: 8
Registriert: Montag 29. November 2021, 17:27

@ __blackjack__:

ein schreibfehler, beide Ordner hießen gleich -> "Eigene Python Skripte".

Aber ich fasse es mal kurz anders zusammen:

Python und dessen Packages sind unter C:\... installiert. Ich arbeite auf dem Ordner D:\Users\Scripts\ um meine eigenen Skripte zu sammeln (Habe zwei Festplatten im PC). Zusätzlich gibt es einen Unterordner namens D:\Users\Scripts\Pics\ um meine Screenshots zu speichern und per Skript zu zugreifen.

Da ich gerne mit eigenen geschriebenen Klassen und Modulen aus D:\Users\Scripts\ arbeiten möchte, mache ich folgenden Befehl in meinen Skripten:
>>> import sys
>>> sys.path.append('D:\Users\Scripts')
>>> import script_example ## Skript-Import aus dem Ordner D:\Users\Scripts\

Meine Vermutung ist jetzt, dass es aufgrund des importes unter Path nicht funktioniert. Denn wenn ich den Ordner D:\Users\Scripts\Pics\ zu D:\Users\New Folder\Pics\ verschiebe (sodass D:\Users\New Folder\Pics\ nicht mehr im Path gelistet ist), dann kann pyautogui mit den Bildern arbeiten (viel mehr opencv kann darauf zugreifen und gibt mir kein None-Wert zurück). Aber ob das so ist, das kann ich nicht beurteilen. Vielleicht liegt es aber auch daran, dass ich den absoluten Pfad bei der pyautogui.locateOnScreen(img_path) angegeben habe, obwohl ich ja schon einen Path habe.

Aber ich kann Damit erst mal weiter arbeiten und bedanke mich für eure Unterstützung.
Antworten