Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 1 | """Create an applet from a Python script. |
| 2 | |
| 3 | This puts up a dialog asking for a Python source file ('TEXT'). |
| 4 | The output is a file with the same name but its ".py" suffix dropped. |
| 5 | It is created by copying an applet template and then adding a 'PYC ' |
| 6 | resource named __main__ containing the compiled, marshalled script. |
| 7 | """ |
| 8 | |
Jack Jansen | 0f452fa | 1995-09-01 11:54:11 +0000 | [diff] [blame] | 9 | |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 10 | import sys |
| 11 | sys.stdout = sys.stderr |
| 12 | |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 13 | import os |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 14 | import MacOS |
Jack Jansen | af647dd | 1997-05-13 15:42:26 +0000 | [diff] [blame] | 15 | import EasyDialogs |
Jack Jansen | 015b70e | 1998-07-31 09:44:23 +0000 | [diff] [blame] | 16 | import buildtools |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 17 | import getopt |
Jack Jansen | 0f452fa | 1995-09-01 11:54:11 +0000 | [diff] [blame] | 18 | |
| 19 | def main(): |
Jack Jansen | 015b70e | 1998-07-31 09:44:23 +0000 | [diff] [blame] | 20 | try: |
| 21 | buildapplet() |
| 22 | except buildtools.BuildError, detail: |
| 23 | EasyDialogs.Message(detail) |
| 24 | |
| 25 | |
| 26 | def buildapplet(): |
| 27 | buildtools.DEBUG=1 |
Jack Jansen | 0f452fa | 1995-09-01 11:54:11 +0000 | [diff] [blame] | 28 | |
| 29 | # Find the template |
| 30 | # (there's no point in proceeding if we can't find it) |
| 31 | |
Jack Jansen | 015b70e | 1998-07-31 09:44:23 +0000 | [diff] [blame] | 32 | template = buildtools.findtemplate() |
| 33 | |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 34 | # Ask for source text if not specified in sys.argv[1:] |
| 35 | |
| 36 | if not sys.argv[1:]: |
Jack Jansen | d44a3ec | 2003-01-22 14:03:12 +0000 | [diff] [blame] | 37 | filename = EasyDialogs.AskFileForOpen(message='Select Python source or applet:', |
Jack Jansen | df976ca | 2003-01-26 20:35:47 +0000 | [diff] [blame] | 38 | typeList=('TEXT', 'APPL')) |
Jack Jansen | d44a3ec | 2003-01-22 14:03:12 +0000 | [diff] [blame] | 39 | if not filename: |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 40 | return |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 41 | tp, tf = os.path.split(filename) |
| 42 | if tf[-3:] == '.py': |
| 43 | tf = tf[:-3] |
| 44 | else: |
Jack Jansen | 015b70e | 1998-07-31 09:44:23 +0000 | [diff] [blame] | 45 | tf = tf + '.applet' |
Jack Jansen | d44a3ec | 2003-01-22 14:03:12 +0000 | [diff] [blame] | 46 | dstfilename = EasyDialogs.AskFileForSave(message='Save application as:', |
| 47 | savedFileName=tf) |
| 48 | if not dstfilename: return |
Jack Jansen | 8554e30 | 1998-02-20 16:06:56 +0000 | [diff] [blame] | 49 | cr, tp = MacOS.GetCreatorAndType(filename) |
| 50 | if tp == 'APPL': |
Jack Jansen | 015b70e | 1998-07-31 09:44:23 +0000 | [diff] [blame] | 51 | buildtools.update(template, filename, dstfilename) |
Jack Jansen | 8554e30 | 1998-02-20 16:06:56 +0000 | [diff] [blame] | 52 | else: |
Jack Jansen | 015b70e | 1998-07-31 09:44:23 +0000 | [diff] [blame] | 53 | buildtools.process(template, filename, dstfilename, 1) |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 54 | else: |
| 55 | |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 56 | SHORTOPTS = "o:r:ne:v?" |
| 57 | LONGOPTS=("output=", "resource=", "noargv", "extra=", "verbose", "help") |
| 58 | try: |
| 59 | options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS) |
| 60 | except getopt.error: |
| 61 | usage() |
| 62 | if options and len(args) > 1: |
| 63 | sys.stderr.write("Cannot use options when specifying multiple input files") |
| 64 | sys.exit(1) |
| 65 | dstfilename = None |
| 66 | rsrcfilename = None |
| 67 | raw = 0 |
| 68 | extras = [] |
| 69 | verbose = None |
| 70 | for opt, arg in options: |
| 71 | if opt in ('-o', '--output'): |
| 72 | dstfilename = arg |
| 73 | elif opt in ('-r', '--resource'): |
| 74 | rsrcfilename = arg |
| 75 | elif opt in ('-n', '--noargv'): |
| 76 | raw = 1 |
| 77 | elif opt in ('-e', '--extra'): |
Jack Jansen | af1d422 | 2003-02-24 16:28:37 +0000 | [diff] [blame] | 78 | if ':' in arg: |
| 79 | arg = arg.split(':') |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 80 | extras.append(arg) |
| 81 | elif opt in ('-v', '--verbose'): |
| 82 | verbose = Verbose() |
| 83 | elif opt in ('-?', '--help'): |
| 84 | usage() |
Jack Jansen | 5fd9458 | 2002-08-22 23:36:11 +0000 | [diff] [blame] | 85 | # On OS9 always be verbose |
| 86 | if sys.platform == 'mac' and not verbose: |
| 87 | verbose = 'default' |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 88 | # Loop over all files to be processed |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 89 | for filename in args: |
Jack Jansen | df976ca | 2003-01-26 20:35:47 +0000 | [diff] [blame] | 90 | cr, tp = MacOS.GetCreatorAndType(filename) |
Jack Jansen | 8554e30 | 1998-02-20 16:06:56 +0000 | [diff] [blame] | 91 | if tp == 'APPL': |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 92 | buildtools.update(template, filename, dstfilename) |
Jack Jansen | 8554e30 | 1998-02-20 16:06:56 +0000 | [diff] [blame] | 93 | else: |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 94 | buildtools.process(template, filename, dstfilename, 1, |
| 95 | rsrcname=rsrcfilename, others=extras, raw=raw, progress=verbose) |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 96 | |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 97 | def usage(): |
| 98 | print "BuildApplet creates an application from a Python source file" |
| 99 | print "Usage:" |
| 100 | print " BuildApplet interactive, single file, no options" |
| 101 | print " BuildApplet src1.py src2.py ... non-interactive multiple file" |
| 102 | print " BuildApplet [options] src.py non-interactive single file" |
| 103 | print "Options:" |
Jack Jansen | af1d422 | 2003-02-24 16:28:37 +0000 | [diff] [blame] | 104 | print " --output o Output file; default based on source filename, short -o" |
| 105 | print " --resource r Resource file; default based on source filename, short -r" |
| 106 | print " --noargv Build applet without drag-and-drop sys.argv emulation, short -n, OSX only" |
| 107 | print " --extra src[:dst] Extra file to put in .app bundle, short -e, OSX only" |
| 108 | print " --verbose Verbose, short -v" |
| 109 | print " --help This message, short -?" |
Jack Jansen | 388fbf3 | 2002-06-09 22:08:52 +0000 | [diff] [blame] | 110 | sys.exit(1) |
| 111 | |
| 112 | class Verbose: |
| 113 | """This class mimics EasyDialogs.ProgressBar but prints to stderr""" |
| 114 | def __init__(self, *args): |
| 115 | if args and args[0]: |
| 116 | self.label(args[0]) |
| 117 | |
| 118 | def set(self, *args): |
| 119 | pass |
| 120 | |
| 121 | def inc(self, *args): |
| 122 | pass |
| 123 | |
| 124 | def label(self, str): |
| 125 | sys.stderr.write(str+'\n') |
Jack Jansen | 7571f30 | 1995-07-29 13:48:41 +0000 | [diff] [blame] | 126 | |
| 127 | if __name__ == '__main__': |
| 128 | main() |