Source code for plugins.export

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#
# Copyright 2009 Glencoe Software, Inc. All rights reserved.
# Use is subject to license terms supplied in LICENSE.txt

"""
   Startup plugin for command-line exporter
"""

import os
import sys

from omero.cli import BaseControl, CLI, NewFileType

HELP = """Support for exporting data in XML and TIFF formats

Example Usage:
  omero export --file new.ome.tif            Image:1
  omero export --file new.ome.xml --type XML Image:1
  omero export --file output-dir  --iterate  Dataset:2

If --iterate is used, the only supported obj is Dataset:<id>
"""


# Default block read size when downloading exported data
DEFAULT_READ_LENGTH = 1000*1000


[docs] class ExportControl(BaseControl): def _configure(self, parser): parser.add_argument( "-f", "--file", type=NewFileType("wb"), required=True, help="Filename to export to or '-' for stdout." " File may not exist") parser.add_argument( "-t", "--type", default="TIFF", choices=("TIFF", "XML"), help="Type of export. Default: %(default)s") parser.add_argument("obj", help="Format: Image:<id>") parser.add_argument( "--iterate", action="store_true", default=False, help="Iterate over an object and write individual objects to the" " directory named by --file (EXPERIMENTAL)") parser.set_defaults(func=self.export) parser.add_login_arguments()
[docs] def export(self, args): img = args.obj if 0 > img.find(":"): self.ctx.die(5, "Format: 'Image:<id>'") klass, id = img.split(":") try: id = int(id) except: self.ctx.die(3, "Bad id format: %s" % id) images = [] datasets = [] if klass == "Image": images.append(id) self.handleImages(args, images) elif klass == "Dataset": if not args.iterate: self.ctx.die(4, "Dataset currently only supported with" " --iterate") datasets.append(id) self.handleDatasets(args, datasets) else: self.ctx.die(5, "Can't add type: %s" % klass)
[docs] def handleDatasets(self, args, datasets): if args.file == sys.stdout: self.ctx.die(950, "Can't use stdin for datasets") f = args.file dir = f.name f.close() os.remove(dir) os.makedirs(dir) c = self.ctx.conn(args) import omero p = omero.sys.ParametersI() p.leaves() ds = c.sf.getContainerService().loadContainerHierarchy("Dataset", datasets, p) if not ds: self.ctx.die(7, "No datasets found: %s", ", ".join([str(x) for x in datasets])) for d in ds: for i in d.linkedImageList(): if i: i = i.id.val args.file = open( os.path.join(dir, "%s.ome.%s" % (i, args.type.lower())), "wb") self.handleImages(args, [i])
[docs] def handleImages(self, args, images): e = None handle = args.file issysout = (handle == sys.stdout) c = self.ctx.conn(args) e = c.getSession().createExporter() remove = True try: for img in images: e.addImage(img) import omero try: if args.type == "TIFF": l = e.generateTiff() else: l = e.generateXml() except omero.ServerError as se: self.ctx.err("%s: %s" % (se.__class__.__name__, se.message)) return remove = False offset = 0 while True: rv = e.read(offset, DEFAULT_READ_LENGTH) if not rv: break rv = rv[:min(DEFAULT_READ_LENGTH, l - offset)] offset += len(rv) handle.write(rv) finally: try: if not issysout: handle.close() if remove: os.remove(handle.name) except Exception as e: self.ctx.err("Failed to close handle: %s" % e) e.close()
try: register("export", ExportControl, HELP) except NameError: if __name__ == "__main__": cli = CLI() cli.register("export", ExportControl, HELP) cli.invoke(sys.argv[1:])