Cómo llamar a una función creada por el usuario en python desde otro script? [SOLUCIONADO]

Temas sobre programación ( php, c, sql, html, perl, python, ruby, java, bash, etc ) y recursos ( herramientas, frameworks, hosting, cms, etc )

Moderadores: maiku, akodo

Responder
Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Cómo llamar a una función creada por el usuario en python desde otro script? [SOLUCIONADO]

Mensaje por cerenkov »

El siguiente código:

Código: Seleccionar todo

#! /usr/bin/python
import os,sys
import grass.script as grass
import numpy as np
from StringIO import StringIO

os.system("clear")

def getCoorVectPoint(n,name_map):

	#Obtencion de las coordenadas x,y,z para todos los puntos
	puntos = grass.read_command("v.to.db", flags="p", map=name_map, type="point", option="coor", units="meters", quiet="True")

	puntos=np.genfromtxt(StringIO(puntos), delimiter="|")

	puntos=puntos[range(n),1:4]

	return puntos

def main():

	#numero de puntos

	n = 15

	name_map="cuenca_puntos"

	p=getCoorVectPoint(n, name_map)

	print p

if __name__ == "__main__": main()
produce la salida que deseo:

Código: Seleccionar todo

[[  615534.04282474  1051549.9693586         0.        ]
 [  626817.61064817  1072537.40551017        0.        ]
 [  642388.93424449  1087431.7150371         0.        ]
 [  668792.48295131  1090591.11402765        0.        ]
 [  691359.61859816  1089237.08588884        0.        ]
 [  710541.68389798  1077050.83263954        0.        ]
 [  718214.51001791  1065090.25074671        0.        ]
 [  716183.46780969  1054258.02563623        0.        ]
 [  713926.75424501  1041169.08696105        0.        ]
 [  709638.99847211  1019053.29402714        0.        ]
 [  687974.54825113  1008898.08298606        0.        ]
 [  644419.97645271  1011380.46790721        0.        ]
 [  619144.78452824  1021535.67894829        0.        ]
 [  612374.64383418  1035527.30304934        0.        ]
 [  615534.04282474  1051549.9693586         0.        ]]
zeito@debian:~$ 
Sin embargo, he tratado por horas de hacer que el script llame al procedimiento getCoorVectPoint (con import), pero colocado en un archivo externo, y no he podido hacerlo. Cuál es el "truco"?
Última edición por cerenkov el Jue Jul 05, 2012 6:55 pm, editado 1 vez en total.

Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1829
Registrado: Dom Oct 10, 2004 7:00 am

Re: Cómo llamar a una función creada por el usuario en python desde otro script?

Mensaje por neurus »

¿Tú dices que tienes otro script, y quieres que llame a la función getCoorVectPoint ?

Sería:

Código: Seleccionar todo

from ARCHIVO import FUNCION
En tu caso (la función está en el archivo "archivo.py"):

Código: Seleccionar todo

from archivo.py import getCoorVectPoint
Aunque admito que tengo algo oxidada mi escritura en Python, así que si no funciona... es que me olvidé algo.

Avatar de Usuario
hipersayan_x
Forista Legendario
Forista Legendario
Mensajes: 1905
Registrado: Vie Abr 27, 2007 7:00 am
Contactar:

Re: Cómo llamar a una función creada por el usuario en python desde otro script?

Mensaje por hipersayan_x »

neurus escribió:

Código: Seleccionar todo

from archivo.py import getCoorVectPoint
Casi. Cuando se importa un modulo no se escribe la extensión, lo correcto sería:

Código: Seleccionar todo

from archivo import getCoorVectPoint
Aunque lo más correcto sería importar el modulo de esta forma:

Código: Seleccionar todo

import archivo
Y luego llamar a la función así:

Código: Seleccionar todo

archivo.getCoorVectPoint(param1, param2, param3, ...)
Eso se hace así para evitar colisiones con otros módulos.
Si los archivos están dentro de un subdirectorio, para importar esos módulos hay que crear un archivo con el nombre __init__.py. Si este tu caso te dejo un enlace:

http://effbot.org/pyfaq/what-is-init-py-used-for.htm

Otro pequeño detalle, trata en lo posible de que tu código sea compatible con Python 3, por ejemplo:

Código: Seleccionar todo

print p
debería ser:

Código: Seleccionar todo

print(p)
Desarrollo en Qt: Qt Developer Network
Mis proyectos: github | SourceForge.net

Avatar de Usuario
neurus
Forista Legendario
Forista Legendario
Mensajes: 1829
Registrado: Dom Oct 10, 2004 7:00 am

Re: Cómo llamar a una función creada por el usuario en python desde otro script?

Mensaje por neurus »

hipersayan_x escribió:
Casi. Cuando se importa un modulo no se escribe la extensión, lo correcto sería:
Eso era. Le veía algo raro al código, por eso hice la aclaración al final.

Avatar de Usuario
cerenkov
Forista Medio
Forista Medio
Mensajes: 402
Registrado: Jue Jun 17, 2010 5:23 am
Ubicación: Venezuela

Re: Cómo llamar a una función creada por el usuario en python desde otro script?

Mensaje por cerenkov »

Gracias por su rápida y generosa ayuda porque fue la que me llevó a analizar mejor la situación. Esta solución que Uds me sugirieron ya la había implementado. Al final, como estaba cansado, ni me molestaba en analizar los errores que señalaba el interprete. La solución era colocar el llamado a las librerías (módulos) dentro de grassMyFunctions. El código principal queda finalmente así:

Código: Seleccionar todo

#! /usr/bin/python
import os,sys

os.system("clear")

import grassMyFunctions #compendio de mis funciones

#tambien funciona: from grassMyFunctions import getCoorVectPoint

def main():

	#numero de puntos

	n = 15

	name_map="cuenca_puntos"

	p=grassMyFunctions.getCoorVectPoint(n, name_map) #si se usa: from grassMyFunctions import getCoorVectPoint
                                                    # entonces hay que usar: p=getCoorVectPoint(n, name_map) 

	print (p)

if __name__ == "__main__": main()
y fuera de este el archivo grassMyFunctions.py que tiene lo siguiente:

Código: Seleccionar todo

import grass.script as grass
import numpy as np
from StringIO import StringIO

def getCoorVectPoint(n,name_map):

	#Obtencion de las coordenadas x,y,z para todos los puntos
	puntos = grass.read_command("v.to.db", flags="p", map=name_map, type="point", option="coor", units="meters", quiet="True")

	puntos=np.genfromtxt(StringIO(puntos), delimiter="|")

	puntos=puntos[range(n),1:4]

	return puntos
La ejecución produce la salida que se encuentra en mi primer post.

Saludos y gracias nuevamente!

Responder
  • Temas similares
    Respuestas
    Vistas
    Último mensaje