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

Source Code for Module omero.plugins.export

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