mirror of
				https://github.com/python/cpython.git
				synced 2025-11-04 03:44:55 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			126 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			126 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 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:]:
 | 
						|
		filename = EasyDialogs.AskFileForOpen(message='Select Python source or applet:', 
 | 
						|
			typeList=('TEXT', 'APPL'))
 | 
						|
		if not filename:
 | 
						|
			return
 | 
						|
		tp, tf = os.path.split(filename)
 | 
						|
		if tf[-3:] == '.py':
 | 
						|
			tf = tf[:-3]
 | 
						|
		else:
 | 
						|
			tf = tf + '.applet'
 | 
						|
		dstfilename = EasyDialogs.AskFileForSave(message='Save application as:', 
 | 
						|
			savedFileName=tf)
 | 
						|
		if not dstfilename: return
 | 
						|
		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()
 | 
						|
		# On OS9 always be verbose
 | 
						|
		if sys.platform == 'mac' and not verbose:
 | 
						|
			verbose = 'default'
 | 
						|
		# 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()
 |