summaryrefslogtreecommitdiffstats
path: root/Mac/Lib
diff options
context:
space:
mode:
authorJack Jansen <jack.jansen@cwi.nl>2002-08-02 14:57:43 (GMT)
committerJack Jansen <jack.jansen@cwi.nl>2002-08-02 14:57:43 (GMT)
commitba1c13db4fbebd7fd1917937a0fe3822068dfc5e (patch)
tree9349740757e81d3b80fc6630edd8f6a9daaeb24c /Mac/Lib
parenta9454e21a70fecfe3686682ea4de716a75a3d828 (diff)
downloadcpython-ba1c13db4fbebd7fd1917937a0fe3822068dfc5e.zip
cpython-ba1c13db4fbebd7fd1917937a0fe3822068dfc5e.tar.gz
cpython-ba1c13db4fbebd7fd1917937a0fe3822068dfc5e.tar.bz2
Final step in making applets first-class citizens: if the applet wants
argv emulation (i.e. if the end user drops files and folders on the applets these will show up in sys.argv) BuildApplet will add the required code to the applet bundle, in __rawmain__.pyc. This code is compiled from appletrawmain.py, it creates sys.argv, cleans up most of the mess and executes either __main__.py or __main__.pyc.
Diffstat (limited to 'Mac/Lib')
-rw-r--r--Mac/Lib/appletrawmain.py46
-rw-r--r--Mac/Lib/buildtools.py10
2 files changed, 56 insertions, 0 deletions
diff --git a/Mac/Lib/appletrawmain.py b/Mac/Lib/appletrawmain.py
new file mode 100644
index 0000000..d2fcd6e
--- /dev/null
+++ b/Mac/Lib/appletrawmain.py
@@ -0,0 +1,46 @@
+# Emulate sys.argv and run __main__.py or __main__.pyc in an environment that
+# is as close to "normal" as possible.
+#
+# This script is put into __rawmain__.pyc for applets that need argv
+# emulation, by BuildApplet and friends.
+#
+import argvemulator
+import os
+import sys
+import marshal
+
+#
+# Create sys.argv
+#
+argvemulator.ArgvCollector().mainloop()
+#
+# Find the realy main program to run
+#
+_dir = os.path.split(sys.argv[0])[0]
+__file__ = os.path.join(_dir, '__main__.py')
+if os.path.exists(__file__):
+ #
+ # Setup something resembling a normal environment and go.
+ #
+ sys.argv[0] = __file__
+ del argvemulator, os, sys, _dir
+ execfile(__file__)
+else:
+ __file__ = os.path.join(_dir, '__main__.pyc')
+ if os.path.exists(__file__):
+ #
+ # If we have only a .pyc file we read the code object from that
+ #
+ sys.argv[0] = __file__
+ _fp = open(__file__, 'rb')
+ _fp.read(8)
+ __code__ = marshal.load(_fp)
+ #
+ # Again, we create an almost-normal environment (only __code__ is
+ # funny) and go.
+ #
+ del argvemulator, os, sys, marshal, _dir, _fp
+ exec __code__
+ else:
+ sys.stderr.write("%s: neither __main__.py nor __main__.pyc found\n"%sys.argv[0])
+ sys.exit(1)
diff --git a/Mac/Lib/buildtools.py b/Mac/Lib/buildtools.py
index 9825708..1047da5 100644
--- a/Mac/Lib/buildtools.py
+++ b/Mac/Lib/buildtools.py
@@ -398,6 +398,16 @@ def process_common_macho(template, progress, code, rsrcname, destname, is_update
pycname = '__rawmain__.pyc'
else:
pycname = '__main__.pyc'
+ # And we also create __rawmain__.pyc
+ outputfilename = os.path.join(destname, 'Contents', 'Resources', '__rawmain__.pyc')
+ if progress:
+ progress.label('Creating __rawmain__.pyc')
+ progress.inc(0)
+ rawsourcefile = os.path.join(sys.prefix, 'Mac', 'Lib', 'appletrawmain.py')
+ rawsource = open(rawsourcefile, 'rU').read()
+ rawcode = compile(rawsource, rawsourcefile, 'exec')
+ writepycfile(rawcode, outputfilename)
+
outputfilename = os.path.join(destname, 'Contents', 'Resources', pycname)
if progress:
progress.label('Creating '+pycname)