Package omero :: Package plugins :: Module export
[hide private]
[frames] | no frames]

Source Code for Module omero.plugins.export

  1  #!/usr/bin/env python 
  2  """ 
  3     Startup plugin for command-line exporter 
  4   
  5     Copyright 2009 Glencoe Software, Inc. All rights reserved. 
  6     Use is subject to license terms supplied in LICENSE.txt 
  7   
  8  """ 
  9   
 10  import os 
 11  import sys 
 12   
 13  from omero.cli import BaseControl, CLI, NewFileType 
 14   
 15  HELP="""Support for exporting data in XML and TIFF formats 
 16   
 17  Example Usage: 
 18    omero export --file new.ome.tif            Image:1 
 19    omero export --file new.ome.xml --type XML Image:1 
 20    omero export --file output-dir  --iterate  Dataset:2 
 21   
 22  If --iterate is used used, the only supported obj is Dataset:<id> 
 23  """ 
 24   
 25   
 26  # Default block read size when downloading exported data 
 27  DEFAULT_READ_LENGTH = 1000*1000 
 28   
 29   
30 -class ExportControl(BaseControl):
31
32 - def _configure(self, parser):
33 parser.add_argument("-f", "--file", type=NewFileType("wb"), required=True, help="Filename to export to or '-' for stdout. File may not exist") 34 parser.add_argument("-t", "--type", default="TIFF", choices=("TIFF", "XML"), help="Type of export. Default: %(default)s") 35 parser.add_argument("obj", help="Format: Image:<id>") 36 parser.add_argument("--iterate", action="store_true", default=False, 37 help="Iterate over an object and write individual objects to the directory named by --file (EXPERIMENTAL)") 38 39 parser.set_defaults(func=self.export)
40
41 - def export(self, args):
42 43 img = args.obj 44 if 0 > img.find(":"): 45 self.ctx.die(5, "Format: 'Image:<id>'") 46 47 klass, id = img.split(":") 48 try: 49 id = long(id) 50 except: 51 self.ctx.die(3, "Bad id format: %s" % id) 52 53 images = [] 54 datasets = [] 55 56 if klass == "Image": 57 images.append(id) 58 self.handleImages(args, images) 59 elif klass == "Dataset": 60 if not args.iterate: 61 self.ctx.die(4, "Dataset currently only supported with --iterate") 62 datasets.append(id) 63 self.handleDatasets(args, datasets) 64 else: 65 self.ctx.die(5, "Can't add type: %s" % klass)
66
67 - def handleDatasets(self, args, datasets):
68 69 f = args.file 70 dir = f.name 71 f.close() 72 os.remove(dir) 73 os.makedirs(dir) 74 75 c = self.ctx.conn(args) 76 77 import omero 78 p = omero.sys.ParametersI() 79 p.leaves() 80 81 ds = c.sf.getContainerService().loadContainerHierarchy("Dataset", datasets, p) 82 if not ds: 83 self.ctx.die(7, "No datasets found: %s", ", ".join([str(x) for x in datasets])) 84 85 for d in ds: 86 for i in d.linkedImageList(): 87 if i: 88 i = i.id.val 89 args.file = open(os.path.join(dir, "%s.ome.%s" % (i,args.type.lower())), "wb") 90 self.handleImages(args, [i])
91
92 - def handleImages(self, args, images):
93 e = None 94 handle = args.file 95 96 c = self.ctx.conn(args) 97 e = c.getSession().createExporter() 98 99 remove = True 100 try: 101 for img in images: 102 e.addImage(img) 103 104 import omero 105 try: 106 if args.type == "TIFF": 107 l = e.generateTiff() 108 else: 109 l = e.generateXml() 110 except omero.ServerError, se: 111 self.ctx.err("%s: %s" % (se.__class__.__name__, se.message)) 112 return 113 114 remove = False 115 offset = 0 116 while True: 117 rv = e.read(offset, DEFAULT_READ_LENGTH) 118 if not rv: 119 break 120 rv = rv[:min(DEFAULT_READ_LENGTH, l - offset)] 121 offset += len(rv) 122 if handle == sys.stdout: 123 sys.stdout.buffer.write(rv) 124 else: 125 handle.write(rv) 126 127 finally: 128 if handle != sys.stdout: 129 handle.close() 130 if remove: 131 os.remove(handle.name) 132 e.close()
133 134 try: 135 register("export", ExportControl, HELP) 136 except NameError: 137 if __name__ == "__main__": 138 cli = CLI() 139 cli.register("export", ExportControl, HELP) 140 cli.invoke(sys.argv[1:]) 141