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