Python error incluso con GhostScript instalado en Macintosh * ¡El problema aún persiste! *

He implementado la siguiente función de guardar en mi progtwig que le permite al usuario guardar como un archivo JPEG lo que dibuje en el canvas Tkinter con la Tortuga. La forma en que se supone que funciona es que primero captura la pantalla y el canvas Tkinter y luego crea un archivo postscript basado en él. Luego convierte ese archivo postscript como un tipo de archivo legible PIL (Python Imaging Library), y luego el PIL guarda el archivo convertido como JPEG. Mi función de guardar se muestra a continuación:

def savefirst(): # Capture screen and Tkinter canvas cnv = getscreen().getcanvas() global hen # Save screen and canvas as Postscript file ps = cnv.postscript(colormode = 'color') # Open a Tkinter file dialog that allows to input his.her own name for the file hen = filedialog.asksaveasfilename(defaultextension = '.jpg') # Convert Postscript file to PIL readable format im = Image.open(io.BytesIO(ps.encode('utf-8'))) # Finally save converted file as a JPEG im.save(hen + '.jpg') 

Sin embargo, cada vez que ejecuto esta función de guardar, aparece el error que se muestra a continuación:

 line 2396, in savefirst im.save(hen + '.jpg') File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/Image.py", line 1646, in save self.load() File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/EpsImagePlugin.py", line 337, in load self.im = Ghostscript(self.tile, self.size, self.fp, scale) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/EpsImagePlugin.py", line 143, in Ghostscript stdout=subprocess.PIPE) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 950, in __init__ restre_signals, start_new_session) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 1544, in _execute_child raise child_exception_type(errno_num, err_msg) FileNotFoundError: [Errno 2] No such file or directory: 'gs' 

¡Aunque ya tengo instalado GhostScript! Lo sé porque primero lo instalé a través de la Imagen de Disco que se encuentra aquí y ejecuté el instalador. Sin embargo, como eso no funcionó, lo hice en la Terminal :

 `pip install ghostscript` 

y como incluso eso no funcionó, ejecuté esto en la Terminal:

 `conda install --channel https://conda.anaconda.org/mlgill ghostscript` 

Utilicé 3 formas de instalar GhostScript y sigo recibiendo el mismo error. ¿Por qué es así y cómo resolvería este problema?

Para tu información: En caso de que necesites saberlo, mi sistema operativo es Mac OS 10.11.2 y mi versión de Python es 3.5.1

EDIT: Entonces, como un comentario dijo una vez, trate de resolver esto usando Homebrew. Así que, naturalmente, lo instalé (ya que no tenía Homebrew ya instalado). Luego, tras una instalación exitosa, ejecuté brew install ghostscript . Después de algunos problemas que resolví, pude instalar exitosamente GhostScript (bueno, de acuerdo con Homebrew). Luego corrí a brew doctor y descubrí que estaba desvinculado. **** Jadeo **** Bueno, una solución es bastante fácil, ¡solo vincúlala! Entonces, eso es justo lo que hice, y después de corregir algunos otros problemas, finalmente pude ejecutar con éxito brew link ghostscript . Sin embargo, a pesar de mis bashs heroicos y corporales de corregir el error, se mantuvo … Sí, a pesar de mis mejores esfuerzos, ¡el error en IDLE cuando ejecuto mi función de guardar sigue ocurriendo! Además, ejecutar gs en el terminal devuelve:

 dyld: Library not loaded: /opt/X11/lib/libXt.6.dylib Referenced from: //anaconda/bin/gs Reason: image not found Trace/BPT trap: 5 

¿Qué TODAVÍA va mal? ¿Por qué Python (o incluso Terminal) no puede encontrar gs ?

EDITAR # 2: Bueno, finalmente he podido instalar GhostScript usando Homebrew . Todo lo que tenía que hacer era instalar xQuarts, que aparentemente necesita GhostScript. ¡SIN EMBARGO, mi problema inicial AÚN NO está solucionado! gs ahora funciona en la Terminal:

 :~ #######$ gs GPL Ghostscript 9.18 (2015-10-05) Copyright (C) 2015 Artifex Software, Inc. All rights reserved. This software comes with NO WARRANTY: see the file PUBLIC for details. 

Pero mi función de guardar STILL no funciona en Python, y ahora estoy seguro de que tengo instalado GhostScript. Sigo recibiendo este error en IDLE cuando ejecuto mi función de guardar:

 FileNotFoundError: [Errno 2] No such file or directory: 'gs' 

¿Qué sigue mal?

EDITAR # 3: Aquí está mi script de Python, en caso de que sea necesario.

EDIT # 4 Eliminado

EDICIÓN # 5: Tengo un pequeño presentimiento de que esto es importante, así que lo estoy poniendo ahí afuera. Cada vez que dirijo a brew doctor en la Terminal, recibo advertencias que no son importantes, pero esta se destaca por alguna razón. Realmente no sé por qué, pero de todos modos, aquí está:

 Warning: Python is installed at /Library/Frameworks/Python.framework Homebrew only supports building against the System-provided Python or a brewed Python. In particular, Pythons installed to /Library can interfere with other software installs. 

Tal vez esto es lo que está causando mis problemas? Si es así, ¿cómo lo arreglaría?

EDICIÓN # 6: Aparentemente funciona para otros (tanto para Windows como para Mac), ¡pero aún NO PARA MÍ! TODAVÍA sigo recibiendo este error cada vez que ejecuto la función savefirst() mi progtwig:

 line 2395, in savefirst im.save(hen + '.jpg') File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/Image.py", line 1646, in save self.load() File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/EpsImagePlugin.py", line 337, in load self.im = Ghostscript(self.tile, self.size, self.fp, scale) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PIL/EpsImagePlugin.py", line 143, in Ghostscript stdout=subprocess.PIPE) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 950, in __init__ restre_signals, start_new_session) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/subprocess.py", line 1544, in _execute_child raise child_exception_type(errno_num, err_msg) FileNotFoundError: [Errno 2] No such file or directory: 'gs' 

Es REALMENTE raro porque gs WORKS en Terminal Y esto:

 x=subprocess.Popen(['/usr/local/bin/gs', '--version'], stdout=subprocess.PIPE) print(x.stdout.read()) 

Funciona en Python IDLE. Pero por alguna razón, la biblioteca de imágenes de Python (PIL) todavía NO PUEDE detectar gs (quizás debido a su función de subproceso.Popen ()?). ¿Porqué es eso? Tengo xQuarts, GhostScript y PIL todos instalados en mi Macintosh , ¡pero todavía me sale el error cuando ejecuto mi función savefirst() ! ¿Por qué?

PD: Todo esto está ocurriendo en Macintosh (OS 10.11.2), ¡por lo que se prefieren las respuestas de aquellos competentes con Macintosh!

EDITAR # 7 Eliminado

EDICIÓN # 8: Bueno, finalmente pude PERMANENTEMENTE (con suerte …) agregar /usr/local/bin/gs a mi RUTA (como puede ver a continuación):

 Library/usr/local/bin/gs:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin://anaconda/bin:/Users/Rohan/anaconda/bin:/Library/Frameworks/Python.framework/Versions/3.5/bin:/Library/Frameworks/Python.framework/Versions/3.4/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin 

Agregué esa ruta ejecutando pico ~MyName/.bash_profile y luego ingresando:

 PATH="Library/usr/local/bin/gs:${PATH}" export PATH 

en el archivo /.bash.profile . Sin embargo, TODAVÍA recibo ese FileNotFoundError en Python! ¿Agregué /usr/local/bin/gs a mi RUTA de manera incorrecta, o incluso en el directorio incorrecto? Si ese no es el caso, entonces ¿por qué la Biblioteca de Imaging de Python TODAVÍA no encuentra gs ?

EDITAR # 9: ¡Hurra! ¡Problema resuelto! El error ya no aparece. Todo lo que tenía que hacer era QUITAR /usr/local/bin/gs de mi Mac Path, y aparentemente agregarlo a mi PYTHONPATH, como al principio de mi progtwig:

 os.environ["PATH"] += ":/usr/local/bin:/usr/local/bin/gs" 

Huzzah! ¡Funciona! PIL ahora puede encontrar gs , y puede guardar el canvas como JPEG, aunque tiene una resolución muy baja, pero eso es un problema para otra pregunta. Por ahora, me alegro de que el problema inicial se haya resuelto y finalmente pueda guardar el canvas como JPEG (¡Gracias a @Copperfield!) 🙂

solo una idea: verificando el código de PIL, use el módulo shutil para encontrar gs haciendo shutil.which("gs") tal vez necesite modificar alguna variable de entorno hasta que funcione.

EDITAR

Hablando en la sala de chat, encontramos lo que parece ser el problema, y ​​eso es un subproceso. Pop no puede encontrar gs , pero nos quedamos atrapados allí. ¿¿Algunas ideas??

Editar 2

Encontré una posible solución, primero gs de mi camino, e bash esto

 >>> import os,shutil,subprocess >>> shutil.which("gswin64c") # shutil.which("gs") >>> test = subprocess.Popen(["gswin64c","--version"],stdout=subprocess.PIPE) # subprocess.Popen(["gs","--version"],stdout=subprocess.PIPE) Traceback (most recent call last): File "", line 1, in  test = subprocess.Popen(["gswin64c","--version"],stdout=subprocess.PIPE) File "C:\Anaconda3\lib\subprocess.py", line 950, in __init__ restre_signals, start_new_session) File "C:\Anaconda3\lib\subprocess.py", line 1220, in _execute_child startupinfo) FileNotFoundError: [WinError 2] El sistema no puede encontrar el archivo especificado >>> os.environ["PATH"] 'C:\\Anaconda3\\Library\\bin;C:\\Anaconda3\\Library\\bin;C:\\Anaconda3;C:\\Anaconda3\\Scripts;C:\\Anaconda3\\Library\\bin;C:\\ProgramData\\Oracle\\Java\\javapath;C:\\Program Files (x86)\\Haskell\\bin;C:\\Program Files (x86)\\Haskell Platform\\2013.2.0.0\\lib\\extralibs\\bin;C:\\Program Files (x86)\\Haskell Platform\\2013.2.0.0\\bin;C:\\Windows\\system32;C:\\Windows;C:\\Windows\\System32\\Wbem;C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\;C:\\Program Files (x86)\\nodejs\\;C:\\Program Files\\MATLAB\\R2009a\\bin;C:\\Program Files\\MATLAB\\R2009a\\bin\\win64;C:\\Program Files (x86)\\Haskell Platform\\2013.2.0.0\\mingw\\bin;C:\\Program Files\\MiKTeX 2.9\\miktex\\bin\\x64\\;C:\\Program Files (x86)\\Skype\\Phone\\;C:\\Anaconda3;C:\\Anaconda3\\Scripts;C:\\Anaconda3\\Library\\bin;C:\\Users\\David\\AppData\\Roaming\\cabal\\bin;C:\\Users\\David\\AppData\\Roaming\\npm;C:\\Program Files (x86)\\Java\\jre7\\bin;C:\\Users\\David\\Dropbox\\Progtwigs Random' >>> os.environ["PATH"] += ";C:\\Program Files\\gs\\gs9.18\\bin" >>> shutil.which("gswin64c") 'C:\\Program Files\\gs\\gs9.18\\bin\\gswin64c.EXE' >>> test = subprocess.Popen(["gswin64c","--version"],stdout=subprocess.PIPE) >>> test.stdout.read() b'9.18\n' >>> 

Para hacer este trabajo con tu código los siguientes cambios que hice:

 #this is very first import import os print("## Addind gs to environ ##", os.environ["PATH"] ) os.environ["PATH"] += ";C:\\Program Files\\gs\\gs9.18\\bin" print("## Addind gs to environ ##", os.environ["PATH"] ) #then the others import, and everything else 

y probarlo funciona bien.

En tu caso eso tal vez sea:

 #this is very first import import os print("## Addind gs to environ ##", os.environ["PATH"] ) os.environ["PATH"] += ":/usr/local/bin" print("## Addind gs to environ ##", os.environ["PATH"] ) #then the others import, and everything else 

es que no funciona intente con uno de estos

 os.environ["PATH"] += "Library/usr/local/bin" os.environ["PATH"] = "/usr/local/bin:" + os.environ["PATH"] os.environ["PATH"] = "Library/usr/local/bin:" + os.environ["PATH"] 

EDITAR 3

A medida que esta solución funciona, una versión más automática de esto puede ser algo como esto:

 #this is the very first thing to do import os, subprocess, shutil #see is gs is avaible if shutil.which("gs") is None: print("GhostScrip is not avaible, search for it") try: gs = subprocess.Popen(["which","gs"],stdout=subprocess.PIPE) gs_path = gs.stdout.read() gs_path = gs_path.decode() if isinstance(gs_path,bytes) else gs_path print("GhostScrip found in",gs_path) os.environ["PATH"] += ":"+ os.path.dirname(gs_path) except Exception as e: raise Warning("GhostScrip not found, this program may fail") del subprocess del shutil #then everything else 

No se pudo replicar en 10.11.2 con homebrew, la misma versión de python, usando XQuartz 2.7.8 ( http://www.xquartz.org ). Encontré esto también ( https://discussions.apple.com/thread/1922974?tstart=0 )

Parece que te estás perdiendo una dependencia. Descarga homebrew e instala ghostscript desde eso:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

brew install ghostscript

También hay opciones para ello que pueden obtenerse utilizando brew info ghostscript :

 --with-djvu Build drivers for DjVU file format --with-x11 Build with x11 support --HEAD Install HEAD version 

Pero la instalación predeterminada es a menudo la más probada.