jueves, marzo 05, 2009

Otra prueba de código

Este post es solo para hacer una prueba. No lo lean.
Es un codigo que me gusta mucho, uno de los motivos por lo que me admiro :)


#!/usr/bin/env python

import cgi
import cgitb
import subprocess
import sys
import os
from tempfile import mkstemp

# Uncomment the following line when debugging
#cgitb.enable()

def badrequest(bad):
""" Display an error menssage """
print("<h1>Bad Request</h1>\n")
print("Use the options provided in the form: %s"%bad)
print("</body></html>")
# Get out of here:
return sys.exit()

print("Content-Type: text/html\n")

form = cgi.FieldStorage()
iterat = form.getvalue("iterat","4")
output = form.getvalue("output","html")
outorder = form.getvalue("outorder","group")
# Get sequence data from text area
seqs = form.getvalue("seq")
if not seqs:
# Since the textarea is empty, check the uploaded file
seqs = form.getvalue("upfile")

# Verify that the user entered valid information.
if iterat not in set(('1','4','8','10','12','14','16')):
badrequest(iterat)
valid_output = set(('html','fasta','msf','clw','clwstrict'))
if output not in valid_output:
badrequest(output)
if outorder not in set(('group', 'stable')):
badrequest(outorder)

print
"<html><head><title>A CGI script</title></head><body>"

# Make a random filename for user entered data
fi_name = mkstemp('.txt','userdata_',"/var/www/muscleweb/")[1]
# Open this random filename
fi_fh = open(fi_name,'w')
# Write the user entered sequences into this temporary file
fi_fh.write(seqs)
fi_fh.close()

# Make a random filename for user entered data
fo_name = mkstemp('.txt','outfile_',"/var/www/muscleweb/")[1]

erfh = open('err.log','w')
cmd
= ['./muscle', '-in', fi_name, '-out', fo_name,
'-quiet', '-maxiters', iterat, '-%s'%output,
'-%s'%outorder]

# Uncomment to check the generated command
#print ' '.join(cmd)
# Run the program with user provided parameters
p = subprocess.Popen(cmd, stderr=erfh, cwd='/var/www/muscleweb')
# Wait until finishing
p.communicate() # Same result as os.waitpid(p.pid,0)
erfh.close()
# Remove the input file since the it is not needed anymore.
os.remove(fi_name)

fout_fh = open(fo_name)
if output=='html':
print(fout_fh.read())
else:
print('<pre>%s</pre>'%fout_fh.read())
fout_fh.close()

# Remove the output file
os.remove(fo_name)

print("</body></html>")

Etiquetas:

4 Comentarios:

A la/s 10:51 p. m., Blogger Gonzalo dijo...

Che, está bueno.. solo un detalle que por ahi te puede interezar..

Si el proceso lo soporta, podés pasarle las cosas por STDIN y leerlas por STDOUT. Por lo general cuando se supone que tiene que recibir un file y queres que lo reciba por stdin, ponés como argumento del file de entrada "-" (es lo estandard, un programita cli bien nacido se lo tiene que bancar), y respecto a sacar la salida por STDOUT depende del script también.. insisto, debería bancarselo

Entonces de esa forma podés hacer algo simil a esto:

blah = subprocess.Popen(["/bin/holaMundo", "--param1", "--param2", "argDeParam2"], stdin=PIPE, stdout=PIPE)
blah.stdin.write("soy la entrada")
soyLaSalida = blah.stdout.read()

Algo asi, sorry que no lo chequee, no estoy frente a mi maquina.

En fin, muy bueno el blog, dale para adelante!

Gonzalo

 
A la/s 10:52 p. m., Blogger Gonzalo dijo...

http://www.python.org/doc/2.6/library/subprocess.html

Aca habla mas del tema

 
A la/s 11:48 p. m., Blogger Sebastian dijo...

Hola, gracias por comentar. Es buena la idea. Yo teina que se podia manipular el stdout y en in, de hecho lo uso en una aplicación que si o si sale por stdout. Pero como esta permite escribir a disco, no lo vi necesario. Pero pensandolo bien, en este caso tambien me sirve porque me evito de escribirlo a disco (al output) lo que es un ahorro importante de tiempo. Si bien el output es chico, si se hace muchas veces la optimización vale la pena. Muchisimas gracias por tu aporte. Espero que leas esto :)

 
A la/s 12:21 a. m., Blogger Gonzalo dijo...

Si! leído.. estoy followeando los comments del post :)

Te digo, no tengo mucha experiencia en Python, pero en bash laburé un par de años, y te aseguro que el overhead que te da laburar con archivos es *enorme* (si, con asteriscos :P), no solo escribir/leer en disco lo cual ya es un pain in the ass :), sino ademas la cantidad de problemas que puede traer aparejado desde, no se, cantidad de inodes reservados, algun problema al vaciar tmp que te llene el disco, en fin.. de todo un poco..

los pipes vuelan!

slds, nos leemos en PyAr (bah, te leo yo, ya que participo muy poco.. el tiempo escasea en épocas de crisis)

Slds!

 

Publicar un comentario

Suscribirse a Comentarios de la entrada [Atom]

Vínculos a esta publicación:

Crear un vínculo

<< Página Principal