Tengo una función en Jython, esta función usa Popen para ejecutar otro programa que escribe un archivo xml en su stdout, que se dirige a un archivo. Cuando el proceso finaliza, cierro el archivo y llamo a otra función para analizarlo. Recibí un montón de mensajes de error que se refieren al acceso a archivos cerrados y / o archivos xml con formato incorrecto (que aparecen bien cuando los miro) durante el análisis. Pensé que output.close () podría regresar antes de cerrar el archivo, así que agregué un bucle que esperaba que output.closed fuera verdadero. Al principio pareció funcionar pero luego mi programa imprimió lo siguiente
blasting
blasted
parsing
parsed
Extending genes found via genemark, 10.00% done
blasting
blasted
parsing
Exception in thread "_CouplerThread-7 (stdout)" Traceback (most recent call last):
File "/Users/mbsulli/jython/Lib/subprocess.py", line 675, in run
self.write_func(buf)
IOError: java.nio.channels.AsynchronousCloseException
[Fatal Error] 17_2_corr.blastp.xml:15902:63: XML document structures must start and end within the same entity.
Retry
blasting
blasted
parsing
Exception in thread "_CouplerThread-9 (stdout)" Traceback (most recent call last):
File "/Users/mbsulli/jython/Lib/subprocess.py", line 675, in run
self.write_func(buf)
IOError: java.nio.channels.ClosedChannelException
[Fatal Error] 17_2_corr.blastp.xml:15890:30: XML document structures must start and end within the same entity.
Retry
blasting
No estoy seguro de cuáles son mis opciones desde aquí. ¿Tenía razón al pensar que el xml no está escrito antes de analizarlo? Si es así, ¿a quién puedo hacer para asegurarme de que sea así?
def parseBlast(fileName):
"""
A function for parsing XML blast output.
"""
print "parsing"
reader = XMLReaderFactory.createXMLReader()
reader.entityResolver = reader.contentHandler = BlastHandler()
reader.parse(fileName)
print "parsed"
return dict(map(lambda iteration: (iteration.query, iteration), reader.getContentHandler().iterations))
def cachedBlast(fileName, blastLocation, database, eValue, query, pipeline, remote = False, force = False):
"""
Performs a blast search using the blastp executable and database in blastLocation on
the query with the eValue. The result is an XML file saved to fileName. If fileName
already exists the search is skipped. If remote is true then the search is done remotely.
"""
if not os.path.isfile(fileName) or force:
output = open(fileName, "w")
command = [blastLocation + "/bin/blastp",
"-evalue", str(eValue),
"-outfmt", "5",
"-query", query]
if remote:
command += ["-remote",
"-db", database]
else:
command += ["-num_threads", str(Runtime.getRuntime().availableProcessors()),
"-db", database]
print "blasting"
blastProcess = subprocess.Popen(command,
stdout = output)
while blastProcess.poll() == None:
if pipeline.exception:
print "Stopping in blast"
blastProcess.kill()
output.close()
raise pipeline.exception
output.close()
while not output.closed:
pass
print "blasted"
try:
return parseBlast(fileName)
except SAXParseException:
print 'Retry'
return cachedBlast(fileName, blastLocation, database, eValue, query, pipeline, remote, True)
Tengo un archivo XML con algunas etiquetas SOAP que quiero ignorar. Estaba analizando el archivo XML con pull-parser pero dejó de funcionar desde que aparecieron las etiquetas SOAP. El archivo XML se parece a: <? ...
Hii Estoy trabajando en una aplicación donde necesito mostrar imágenes de una carpeta seleccionada por un usuario. Todas las imágenes presentes en la carpeta deben mostrarse. Me gustaría saber cómo mostrarlas ...
Escribí un código que escribe objetos comprimidos en un archivo. Mi pregunta es: ¿hay alguna forma en que pueda realizar un seguimiento del incremento del tamaño de mi archivo a medida que se escribe el objeto? Aquí está mi código: ...
Estoy trabajando en un programa para mover archivos de una carpeta a otra. Tengo alrededor de 1000 archivos y cada archivo se debe mover a una hora fija. En este momento estoy usando un temporizador como: Timer timer = new Timer (); ...