[PYTHON] LocateCenterOnScreen ne fonctionne pas sur PyAutoGui

Résumé

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

LocateOnScreen (" target.png ") affiche les coordonnées du centre de l'emplacement qui correspond à target.png sur l'écran.

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

Je me suis mis en colère.

Environnement d'exécution

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

Pourquoi es-tu en colère?

On dit qu'il n'y a pas de scrot", mais je l'ai déjà introduit (scrot est une commande pour prendre une capture d'écran depuis le terminal). Apparemment, l'erreur vient de pyscreeze au lieu de ** pyautogui Il semble que ce soit le cas. ** La méthode pour déterminer si scrot of ... / pyscreeze / __ init __. Py est installé peut ne pas fonctionner correctement.

Enquête

La variable scrotExists in ... / pyscreeze / __ init __. Py contrôle la présence ou l'absence de 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

Ce qui me met en colère parce que "il n'y a pas de" scrot "", c'est que "scrotExists" est faux. Il semble que "subprocess.Popen (). Wait ()" ne fonctionne pas comme prévu. En raison du déplacement, shell = True est suspect. Popen Si vous spécifiez shell = True, le shell qui s'exécute sur Ubuntu semble être / bin / sh. Si vous spécifiez shell = False, il s'exécute sur zsh dans votre environnement:

>>> 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

La valeur de retour de zéro est le code de retour. Il se termine normalement. Comme vous pouvez le voir, le format de la commande diffère selon la spécification de "shell". Le premier transmet "string", le second transmet "list". "/ Bin Je me suis demandé si / sh était mauvais, mais ce n'était pas le cas. Après tout, "passer avec shell = True et string "ou" passer avec shell = Falseetlist" Soit on a fonctionné. Je ne l'ai pas étudié correctement, mais la spécification de subprocess.popen ()` est différente dans la version python, ou est-ce une autre raison?

Je me demande si cela fonctionnera, mais je suis toujours en colère:

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 est un NonType.". Même si c'est un objet qui doit être fermé, j'ai commenté cette partie car le destructeur la suivrait. Le résultat a bien fonctionné.

Leçon

Cela a fonctionné pour le moment, donc quand j'ai essayé de lancer une Pull Request sur github, c'était déjà corrigé:

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

Avec des commentaires polis. En regardant la version, github est "0.1.8". "Conda cloud" est "0.1.0". Utilisons la dernière version, j'ai appris un peu.

Recommended Posts

LocateCenterOnScreen ne fonctionne pas sur PyAutoGui
Virtualenv ne fonctionne pas sur Python 3.5 (Windows)
Jinja2 2.9.6 ne fonctionne pas sur la série Lambda Python 3
Lorsque le programme pip installé sur Mac / Marvericks ne fonctionne pas
Le problème de chemin ne se produit pas sur debian-linux
[VScode] Le format autopep8 ne fonctionne pas [Python]
La commande gqlgen ne fonctionne pas avec gqlgen de go
Remarques sur ce qu'il faut faire lorsque l'effacement des ombres ne fonctionne pas avec scatter () / scatter3d () de matplotlib
Après l'installation de php7.2, la commande php ne fonctionne pas
Lorsque la spécification générique ne fonctionne pas avec pylint
jupyter notebook ne commence pas par fish sur mac
J'ai réussi à résoudre la situation où Python ne fonctionne pas sur Mac
Que faire si Python3 Venv ne fonctionne pas bien sur Raspberry Pi
L'acquisition d'événements par clic droit ne fonctionne pas avec opencv-python
Cliquer sur l'attribut de nom dans Selenium ne soumet pas
Commande lorsque l'arrêt de l'ACPI ne fonctionne pas dans VirtualBox
Le traitement parallèle de Python joblib ne fonctionne pas dans l'environnement uWSGI. Comment traiter en parallèle sur uWSGI?
Jour 65 (Solution) Le bloc-notes Jupyter ne fonctionne pas avec le noyau non connecté.
GrabBox ne fonctionnait pas sur Sierra
la version de python ne change pas
Fcitx ne fonctionne pas sur Flatpak
le journal distutils n'apparaît pas
Solution lorsque la couverture de fond de VS Code pour Linux ne fonctionne pas
L'histoire du travail de sortie de l'application que Google ne raconte pas
Les touches fléchées ne fonctionnent pas dans le shell zsh + python sur Mac