mirror of
https://github.com/python/cpython.git
synced 2025-07-28 05:34:31 +00:00

verbose output to the console, etc. - Allow Cocoa applets to be built with BuildApplet. No full testing has been done yet to ensure OS9 operation hasn't suffered.
124 lines
3.5 KiB
Python
124 lines
3.5 KiB
Python
"""Create an applet from a Python script.
|
|
|
|
This puts up a dialog asking for a Python source file ('TEXT').
|
|
The output is a file with the same name but its ".py" suffix dropped.
|
|
It is created by copying an applet template and then adding a 'PYC '
|
|
resource named __main__ containing the compiled, marshalled script.
|
|
"""
|
|
|
|
|
|
import sys
|
|
sys.stdout = sys.stderr
|
|
|
|
import os
|
|
import macfs
|
|
import MacOS
|
|
import EasyDialogs
|
|
import buildtools
|
|
import getopt
|
|
|
|
def main():
|
|
try:
|
|
buildapplet()
|
|
except buildtools.BuildError, detail:
|
|
EasyDialogs.Message(detail)
|
|
|
|
|
|
def buildapplet():
|
|
buildtools.DEBUG=1
|
|
|
|
# Find the template
|
|
# (there's no point in proceeding if we can't find it)
|
|
|
|
template = buildtools.findtemplate()
|
|
|
|
# Ask for source text if not specified in sys.argv[1:]
|
|
|
|
if not sys.argv[1:]:
|
|
srcfss, ok = macfs.PromptGetFile('Select Python source or applet:', 'TEXT', 'APPL')
|
|
if not ok:
|
|
return
|
|
filename = srcfss.as_pathname()
|
|
tp, tf = os.path.split(filename)
|
|
if tf[-3:] == '.py':
|
|
tf = tf[:-3]
|
|
else:
|
|
tf = tf + '.applet'
|
|
dstfss, ok = macfs.StandardPutFile('Save application as:', tf)
|
|
if not ok: return
|
|
dstfilename = dstfss.as_pathname()
|
|
cr, tp = MacOS.GetCreatorAndType(filename)
|
|
if tp == 'APPL':
|
|
buildtools.update(template, filename, dstfilename)
|
|
else:
|
|
buildtools.process(template, filename, dstfilename, 1)
|
|
else:
|
|
|
|
SHORTOPTS = "o:r:ne:v?"
|
|
LONGOPTS=("output=", "resource=", "noargv", "extra=", "verbose", "help")
|
|
try:
|
|
options, args = getopt.getopt(sys.argv[1:], SHORTOPTS, LONGOPTS)
|
|
except getopt.error:
|
|
usage()
|
|
if options and len(args) > 1:
|
|
sys.stderr.write("Cannot use options when specifying multiple input files")
|
|
sys.exit(1)
|
|
dstfilename = None
|
|
rsrcfilename = None
|
|
raw = 0
|
|
extras = []
|
|
verbose = None
|
|
for opt, arg in options:
|
|
if opt in ('-o', '--output'):
|
|
dstfilename = arg
|
|
elif opt in ('-r', '--resource'):
|
|
rsrcfilename = arg
|
|
elif opt in ('-n', '--noargv'):
|
|
raw = 1
|
|
elif opt in ('-e', '--extra'):
|
|
extras.append(arg)
|
|
elif opt in ('-v', '--verbose'):
|
|
verbose = Verbose()
|
|
elif opt in ('-?', '--help'):
|
|
usage()
|
|
# Loop over all files to be processed
|
|
for filename in args:
|
|
cr, tp = MacOS.GetCreatorAndType(filename)
|
|
if tp == 'APPL':
|
|
buildtools.update(template, filename, dstfilename)
|
|
else:
|
|
buildtools.process(template, filename, dstfilename, 1,
|
|
rsrcname=rsrcfilename, others=extras, raw=raw, progress=verbose)
|
|
|
|
def usage():
|
|
print "BuildApplet creates an application from a Python source file"
|
|
print "Usage:"
|
|
print " BuildApplet interactive, single file, no options"
|
|
print " BuildApplet src1.py src2.py ... non-interactive multiple file"
|
|
print " BuildApplet [options] src.py non-interactive single file"
|
|
print "Options:"
|
|
print " --output o Output file; default based on source filename, short -o"
|
|
print " --resource r Resource file; default based on source filename, short -r"
|
|
print " --noargv Build applet without drag-and-drop sys.argv emulation, short -n, OSX only"
|
|
print " --extra f Extra file to put in .app bundle, short -e, OSX only"
|
|
print " --verbose Verbose, short -v"
|
|
print " --help This message, short -?"
|
|
sys.exit(1)
|
|
|
|
class Verbose:
|
|
"""This class mimics EasyDialogs.ProgressBar but prints to stderr"""
|
|
def __init__(self, *args):
|
|
if args and args[0]:
|
|
self.label(args[0])
|
|
|
|
def set(self, *args):
|
|
pass
|
|
|
|
def inc(self, *args):
|
|
pass
|
|
|
|
def label(self, str):
|
|
sys.stderr.write(str+'\n')
|
|
|
|
if __name__ == '__main__':
|
|
main()
|