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.
OS : Ubuntu 16.04 LTS Shell : Zsh Python : anaconda3-4.1.1 on pyenv
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.
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 = Falseet
list" 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é.
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