| """BuildCGIApplet.py -- Create a CGI applet from a Python script. |
| |
| Specilized version of BuildApplet, enabling Python CGI scripts to be |
| used under Mac web servers like WebStar. The __main__ program is |
| PythonCGISlave.py, which provides a compatibility layer, emulating |
| Unix-style CGI scripts. See CGI_README.txt for details. |
| """ |
| |
| import sys |
| import os |
| import macfs |
| import MacOS |
| import Res |
| import EasyDialogs |
| import buildtools |
| import py_resource |
| |
| |
| def main(): |
| try: |
| buildcgiapplet() |
| except buildtools.BuildError, detail: |
| EasyDialogs.Message(detail) |
| |
| |
| def buildcgiapplet(): |
| buildtools.DEBUG=1 |
| |
| # Find the template |
| # (there's no point in proceeding if we can't find it) |
| |
| template = buildtools.findtemplate() |
| wrapper = "PythonCGISlave.py" |
| if not os.path.exists("PythonCGISlave.py"): |
| wrapper = os.path.join(sys.exec_prefix, ":Mac:Tools:CGI", wrapper) |
| |
| # Ask for source text if not specified in sys.argv[1:] |
| if not sys.argv[1:]: |
| srcfss, ok = macfs.PromptGetFile('Select a CGI script:', 'TEXT', 'APPL') |
| if not ok: |
| return |
| filename = srcfss.as_pathname() |
| dstfilename = mkcgifilename(filename) |
| dstfss, ok = macfs.StandardPutFile('Save application as:', |
| os.path.basename(dstfilename)) |
| if not ok: |
| return |
| dstfilename = dstfss.as_pathname() |
| buildone(template, wrapper, filename, dstfilename) |
| else: |
| # Loop over all files to be processed |
| for filename in sys.argv[1:]: |
| dstfilename = mkcgifilename(filename) |
| buildone(template, wrapper, filename, dstfilename) |
| |
| |
| def mkcgifilename(filename): |
| if filename[-3:] == '.py': |
| filename = filename[:-3] |
| filename = filename + ".cgi" |
| return filename |
| |
| |
| def buildone(template, wrapper, src, dst): |
| buildtools.process(template, wrapper, dst, 1) |
| # write source as a PYC resource into dst |
| ref = Res.FSpOpenResFile(dst, 1) |
| try: |
| Res.UseResFile(ref) |
| py_resource.frompyfile(src, "CGI_MAIN", preload=1) |
| finally: |
| Res.CloseResFile(ref) |
| |
| |
| if __name__ == '__main__': |
| main() |