Jump to content
  • 0

Error en script python (gigapanDownloader.py)


Mgbu
 Share

Question

Estoy intentando descargar unos panoramas de gigapan.com para poner de fondo (bueno, puede que sea ilegal pero descargar un fondito para mí nada más no pasa nada o no? :reves:) Para eso hay un programita escrito en Python que es gigapanDownloader.py (click derecho, guardar como...) EDIT: Esta es la página del programa: https://github.com/DeniR/Gigapan-Downloader-and-stitcher

 

El problema es que no me anda. Por lo que veo el programa primero descarga la imagen en pedazos y luego las une con Imagemagick, las imágenes las descarga bien pero no anda la parte de unir. Como ejemplo pongo lo que pasa cuando descargo el panorama más chico que hay en gigapan: el 2427. para descargarla hay que poner en un terminal "python gigapanDownloader.py 2427". Al hacer eso me aparece esto en una terminal:

python gigapanDownloader2.py 2427
600 174 256
3 1 1
http://www.gigapan.org/get_ge_tile/2427/1/0/0 0000-0000.jpg
http://www.gigapan.org/get_ge_tile/2427/1/0/1 0000-0001.jpg
http://www.gigapan.org/get_ge_tile/2427/1/0/2 0000-0002.jpg
Stitching... 
Traceback (most recent call last):
  File "gigapanDownloader2.py", line 76, in <module>
    subprocess.call('"'+imagemagick+'" -depth 8 -geometry 256x256+0+0 -mode concatenate -tile '+str(wt)+'x '+str(photo_id)+'\\*.jpg '+str(photo_id)+'-giga.'+outputformat) 
  File "/usr/lib/python2.7/subprocess.py", line 522, in call
    return Popen(*popenargs, **kwargs).wait()
  File "/usr/lib/python2.7/subprocess.py", line 709, in __init__
    errread, errwrite)
  File "/usr/lib/python2.7/subprocess.py", line 1326, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

Al parecer el error está en esta línea del programa:

subprocess.call('"'+imagemagick+'" -depth 8 -geometry 256x256+0+0 -mode concatenate -tile '+str(wt)+'x '+str(photo_id)+'\\*.jpg '+str(photo_id)+'-giga.'+outputformat)

Lo malo es que el error que tira no se entiende nada :D. Lo que sería más probable es que la ruta al programa "montage" de imagemagick esté mal. Pero yo modifiqué el programa para que use mi ruta, que es: "/etc/alternatives/montage".

Yo sé que esa ruta está bien porque cuando yo corro montage por mí mismo sí funciona, por ejemplo esto en una terminal sí funciona:

/etc/alternatives/montage -depth 8 -geometry 256x256+0+0 -mode concatenate -tile 2x 2427/*.jpg 2427-giga.tif

A esa línea la hice viendo mas o menos cómo reemplazar los argumentos

 

Por las dudas este es mi script modificado:

 

 

#usage: python downloadGigaPan.py <photoid>
# http://gigapan.org/gigapans/<photoid>>
# change imagemagick or outputformat below
# Project info https://github.com/DeniR/Gigapan-Downloader-and-stitcher

from xml.dom.minidom import *
from urllib2 import *
from urllib import *
import sys,os,math,subprocess

outputformat="tif" #psb or tif
imagemagick="/etc/alternatives/montage" #Linux path to Imagemagick
if os.name == "nt":
  imagemagick="C:\\Program Files\\ImageMagick-6.8.5-Q16\\montage.exe" #Windows path to Imagemagick

def getText(nodelist):
    rc = ""
    for node in nodelist:
        if node.nodeType == node.TEXT_NODE:
            rc = rc + node.data
    return rc

def find_element_value(e,name):
    nodelist = [e]
    while len(nodelist) > 0 :
        node = nodelist.pop()
        if node.nodeType == node.ELEMENT_NODE and node.localName == name:
            return getText(node.childNodes)
        else:
            nodelist += node.childNodes

    return None


#main

photo_id = int(sys.argv[1])
if not os.path.exists(str(photo_id)):
    os.makedirs(str(photo_id))

base = "http://www.gigapan.org"

# read the kml file
h = urlopen(base+"/gigapans/%d.kml"%(photo_id))
photo_kml=h.read()

# find the width and height, level
dom = parseString(photo_kml)

height=int(find_element_value(dom.documentElement, "maxHeight"))
width=int(find_element_value(dom.documentElement, "maxWidth"))
tile_size=int(find_element_value(dom.documentElement, "tileSize"))

print width,height,tile_size


maxlevel = max(math.ceil(width/tile_size), math.ceil(height/tile_size))
maxlevel = int(math.ceil(math.log(maxlevel)/math.log(2.0)))
wt = int(math.ceil(width/tile_size))+1
ht = int(math.ceil(height/tile_size))+1
print wt,ht,maxlevel

#loop around to get every tile
for j in xrange(ht):
    for i in xrange(wt):
        filename = "%04d-%04d.jpg"%(j,i)
    pathfilename = str(photo_id)+"/"+filename
    if not os.path.exists(pathfilename) :
            url = "%s/get_ge_tile/%d/%d/%d/%d"%(base,photo_id, maxlevel,j,i)
            print url, filename
            h = urlopen(url)
            fout = open(pathfilename,"wb")
            fout.write(h.read())
            fout.close()
print "Stitching... "
subprocess.call('"'+imagemagick+'" -depth 8 -geometry 256x256+0+0 -mode concatenate -tile '+str(wt)+'x '+str(photo_id)+'\\*.jpg '+str(photo_id)+'-giga.'+outputformat)
print "OK"

 

 

 

También probé a ver si el problema era "subprocess.call()" que no funcionaba, pero cuando hacía "subprocess.call("ls")" sí funciona

 

Entonces el problema es lo que está dentro de "subprocess.call()", pero como no se de Python no lo puedo solucionar. Otro dato es que dice que se necesita Python 2 en vez de Python 3. Pero no sé cómo reemplazar las versiones

Edited by Mgbu
Link to comment
Share on other sites

8 answers to this question

Recommended Posts

  • 0

 

La ruta correcta a montage, si "whereis" no me ha traicionado es

/usr/bin/montage

Y para ejecutarlo con python 2.7 debería bastar con especificarlo:

python2.7 gigapanDownloader2.py

Lo pude solucionar! :bien:

Al final era un problema del programa, al parecer en python cuando uno hace subprocess.call llamando a un programa con argumentos debe especificar shell=True. Eso hizo que "ls" funcionara mientras que "montage" como tenía argumentos no funcionara.

Acá encontré la respuesta, la encontré simplemente buscando la última linea del error, no lo había hecho antes porque creía que significaba simplemente archivo no encontrado, pero no, es un error específico de subprocess.call por lo que se ve

 

Finalmente se arregla agregando un argumento más a subprocess.call que contenga shell=True. Quedando así:

subprocess.call('"'+imagemagick+'" -depth 8 -geometry 256x256+0+0 -mode concatenate -tile '+str(wt)+'x '+str(photo_id)+'\\*.jpg '+str(photo_id)+'-giga.'+outputformat, shell=True)
Link to comment
Share on other sites

  • 0

Esta tarde me puse a mejorar el programa, ahora uno puede elegir el nivel de resolución de la descarga (muy util, si necesito un fondo de 1920x1080, descargo una resolucion parecida y no toda la imagen, que puede llegar a medir mas de 100000x30000 como la que descargué hoy), te dice los datos de la imagen y el progreso de descarga.

No se como funciona git pero por lo que veo puedo hacer un fork de ese proyecto, o sea que puedo subir mi propio programa como variación de ese. ¿Se puede?¿Tengo que preguntarle antes al desarrollador del programa?

Link to comment
Share on other sites

  • 0

No se como funciona git pero por lo que veo puedo hacer un fork de ese proyecto, o sea que puedo subir mi propio programa como variación de ese. ¿Se puede?¿Tengo que preguntarle antes al desarrollador del programa?

Nunca he colaborado con otro proyecto, pero lo que tienes que hacer en GitHub es hacer un fork, que básicamente crea un repositorio idéntico en tu cuenta de usuario, subes ahí los cambios y luego haces un pull request al proyecto oficial y los desarrolladores decidirán si lo tienen en cuenta o no.

 

Si has cambiado varias cosas busca en el repositorio a ver si tienen alguna serie de convenciones de estilo que siguen o requisitos extra para aceptar pull requests.

 

Por cierto, mirando por encima el repositorio he visto que parece que ya corrigieron el error que reportaste.

Edited by kakahuete
Link to comment
Share on other sites

  • 0

 

No se como funciona git pero por lo que veo puedo hacer un fork de ese proyecto, o sea que puedo subir mi propio programa como variación de ese. ¿Se puede?¿Tengo que preguntarle antes al desarrollador del programa?

Nunca he colaborado con otro proyecto, pero lo que tienes que hacer en GitHub es hacer un fork, que básicamente crea un repositorio idéntico en tu cuenta de usuario, subes ahí los cambios y luego haces un pull request al proyecto oficial y los desarrolladores decidirán si lo tienen en cuenta o no.

 

Si has cambiado varias cosas busca en el repositorio a ver si tienen alguna serie de convenciones de estilo que siguen o requisitos extra para aceptar pull requests.

 

Por cierto, mirando por encima el repositorio he visto que parece que ya corrigieron el error que reportaste.

 

Si, ya hice el fork pero como al principio creía que no podía colaborar le cambié el nombre a todo y modifiqué bastante. Voy a ver si después lo modifico como debería ser, está bueno esto de Git

Link to comment
Share on other sites

  • 0

Sí. Una vez que lo vas controlando es una pasada. Te recomiendo esta guía, yo la estoy usando para aprender a usarlo y también como manual de referencia para cuando tengo alguna duda.

Link to comment
Share on other sites

  • 0

All final hice un fork como se debería, un pull request y ahora el repositorio original tiene las cosas que agregué :lol:

Voy a ver la guía, todavía se me hace lio con algunos nombres y comandos jaja

Link to comment
Share on other sites

  • 0

He echado un vistazo rápido al código y si te interesa seguir colaborando en ese proyecto o programar en Python, deberías usar print("lo que sea") en vez de print("lo que sea"). En Python2 es la forma correcta, aunque la otra esté admitida. Pero este fue uno de los cambios en Python3. Si te interesa, también deberías mirarte la convención de estilo oficial (PEP), donde se establecen una serie de normas recomendadas para escribir el código lo más pythonico posible, para que sea más universal y legible por otros y más fácilmente adaptable a nuevas versiones y cambios.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...