[PYTHON] LocateCenterOnScreen funktioniert nicht mit PyAutoGui

Zusammenfassung

import pyautogui as pa
position = pa.locateCenterOnScreen("target.png ")

locateOnScreen (" target.png ") gibt die Koordinaten der Mitte des Ortes aus, die mit target.png auf dem Bildschirm übereinstimmen.

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    position = pa.locateCenterOnScreen("target.png ")
  File "/home/USER/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/pyscreeze/__init__.py", line 122, in locateCenterOnScreen
    return center(locateOnScreen(image, grayscale))
  File "/home/USER/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/pyscreeze/__init__.py", line 105, in locateOnScreen
    screenshotIm = screenshot()
  File "/home/USER/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/pyscreeze/__init__.py", line 156, in _screenshot_linux
    raise NotImplementedError('"scrot" must be installed to use screenshot functions in Linux. Run: sudo apt-get install scrot')
NotImplementedError: "scrot" must be installed to use screenshot functions in Linux. Run: sudo apt-get install scrot

Ich wurde wütend.

Ausführungsumgebung

OS : Ubuntu 16.04 LTS Shell : Zsh Python : anaconda3-4.1.1 on pyenv

Worüber ärgest du dich?

Es wird gesagt, dass "es keinen" Scrot "gibt", aber ich habe es bereits eingeführt ("scrot" ist ein Befehl, um einen Screenshot vom Terminal zu machen). Anscheinend fliegt der Fehler von "pyscreeze" anstelle von "pyautogui" Es scheint so. ** Die Methode, um festzustellen, ob "scrot" von "... / pyscreeze / __ init __. Py" installiert ist, funktioniert möglicherweise nicht richtig.

Umfrage

Die Variable "scrotExists" in "... / pyscreeze / __ init __. Py" steuert das Vorhandensein oder Fehlen von "scrot":

try:
    if sys.platform not in ('java', 'darwin', 'win32'):
        whichProc = subprocess.Popen(['which', 'scrot'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
        scrotExists = whichProc.wait() == 0
        
except:
    # if there is no "which" program to find scrot, then assume there is no scrot.
    pass

Was mich wütend macht, dass "es gibt keinen" scrot "" ist, dass "scrotExists" falsch ist. Es scheint, dass "subprocess.Popen (). Wait ()" nicht wie erwartet funktioniert. Infolge des Verschiebens ist shell = True verdächtig. Popen Wenn Sie "shell = True" angeben, scheint die Shell, die unter Ubuntu ausgeführt wird, "/ bin / sh" zu sein. Wenn Sie "shell = False" angeben, wird sie in Ihrer Umgebung auf zsh ausgeführt:

>>> sp.Popen("echo $0", shell=True).wait()
/bin/sh
0

>>> sp.Popen(["ps"]).wait()
  PID TTY          TIME CMD
 2418 pts/20   00:00:00 python
 2871 pts/20   00:00:00 ps
21011 pts/20   00:00:00 zsh
26515 pts/20   00:00:24 emacs
0

Der Rückgabewert Null ist der Rückkehrcode. Er endet normal. Wie Sie sehen können, unterscheidet sich das Format des Befehls in Abhängigkeit von der Spezifikation von "shell". Ersterer übergibt "string", letzterer übergibt "list". / Bin Ich habe mich gefragt, ob / sh schlecht ist, aber nicht. Immerhin "pass with shell = True und string "oder" pass with shell = False und list" Entweder hat einer funktioniert. Ich habe ihn nicht richtig untersucht, aber unterscheidet sich die Spezifikation von "subprocess.popen ()" in der Python-Version, oder ist es ein anderer Grund?

Ich frage mich, ob das funktionieren wird, aber ich bin immer noch wütend:

Traceback (most recent call last):
  File "test.py", line 5, in <module>
    position = pa.locateCenterOnScreen("images/target.png ")
  File "/home/USER/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/pyscreeze/__init__.py", line 120, in locateCenterOnScreen
    return center(locateOnScreen(image, grayscale))
  File "/home/USER/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/site-packages/pyscreeze/__init__.py", line 106, in locateOnScreen
    screenshotIm.fp.close() # Screenshots on Windows won't have an fp since they came from ImageGrab, not a file.
AttributeError: 'NoneType' object has no attribute 'close'

" ScreenshotIm.fp ist ein NonType.". Auch wenn es sich um ein Objekt handelt, das geschlossen werden muss, habe ich diesen Teil auskommentiert, weil der Destruktor ihm folgen würde. Das Ergebnis hat gut funktioniert.

Lektion

Es hat vorerst funktioniert. Als ich versuchte, eine Pull-Anfrage an Github zu senden, war sie bereits behoben:

def locateAllOnScreen(image, **kwargs):
    screenshotIm = screenshot(region=None) # the locateAll() function must handle cropping to return accurate coordinates, so don't pass a region here.
    retVal = locateAll(image, screenshotIm, **kwargs)
    try:
        screenshotIm.fp.close()
    except AttributeError:
        # Screenshots on Windows won't have an fp since they came from
        # ImageGrab, not a file. Screenshots on Linux will have fp set
        # to None since the file has been unlinked
        pass
    return retVal

Mit höflichen Kommentaren. In der Version ist Github "0.1.8". "Conda Cloud" ist "0.1.0". Verwenden wir die neueste Version. Ich habe ein wenig gelernt.

Recommended Posts

LocateCenterOnScreen funktioniert nicht mit PyAutoGui
Virtualenv funktioniert nicht unter Python 3.5 (Windows)
Jinja2 2.9.6 funktioniert nicht mit der Lambda Python 3-Serie
Wenn das auf Mac / Marvericks installierte Programm pip nicht funktioniert
Pfadproblem tritt unter Debian-Linux nicht auf
Das Autopep8-Format [VScode] funktioniert nicht. [Python]
Der Befehl gqlgen funktioniert nicht mit go's gqlgen
Hinweise, was zu tun ist, wenn das Löschen von Schatten nicht mit Scatter () / Scatter3d () von Matplotlib funktioniert
Nach der Installation von php7.2 funktioniert der Befehl php nicht
Wenn die Platzhalterspezifikation mit Pylint nicht funktioniert
Jupyter Notebook beginnt nicht mit Fisch auf dem Mac
Ich habe es geschafft, die Situation zu lösen, in der Python auf dem Mac nicht funktioniert
Was tun, wenn python3 venv auf Raspberry Pi nicht gut funktioniert?
Die Ereigniserfassung mit der rechten Maustaste funktioniert nicht mit opencv-python
Das Klicken auf das Namensattribut in Selenium wird nicht gesendet
Befehl, wenn das Herunterfahren von ACPI in VirtualBox nicht funktioniert
Die parallele Verarbeitung der Python-Joblib funktioniert in der uWSGI-Umgebung nicht. Wie verarbeite ich parallel auf uWSGI?
Tag 65 (Lösung) Das Jupyter-Notebook funktioniert nicht mit dem nicht verbundenen Kernel.
GrabBox hat in Sierra nicht funktioniert
Python-Version wechselt nicht
Fcitx funktioniert nicht mit Flatpak
distutils log wird nicht angezeigt
Lösung, wenn die Hintergrundabdeckung von VS Code für Linux nicht funktioniert
Die Geschichte der Release-Arbeit der Anwendung, die Google nicht erzählt
Die Pfeiltasten funktionieren in der zsh + python-Shell auf dem Mac nicht