mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 05:01:30 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			127 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			127 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()
 | |
| 		# 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()
 | 
