Some nits...

Add the script directory to the path.

Fix the sanity checks on the arguments so they don't mess up the -m
option; remove the requirement that the script must have a .py
extension.
diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py
index b6f2d4a..ca16654 100755
--- a/Tools/freeze/freeze.py
+++ b/Tools/freeze/freeze.py
@@ -2,7 +2,7 @@
 
 """Freeze a Python script into a binary.
 
-usage: freeze [options...] script.py [module]...
+usage: freeze [options...] script [module]...
 
 Options:
 
@@ -43,8 +43,7 @@
 
 Arguments:
 
-script.py:    The Python script to be executed by the resulting binary.
-              It *must* end with a .py suffix!
+script:       The Python script to be executed by the resulting binary.
 
 module ...:   Additional Python modules (referenced by pathname)
               that will be included in the resulting binary.  These
@@ -88,7 +87,7 @@
     prefix = None                       # settable with -p option
     exec_prefix = None                  # settable with -P option
     extensions = []
-    path = sys.path
+    path = sys.path[:]
     modargs = 0
     debug = 1
     odir = ''
@@ -195,16 +194,16 @@
     if not args:
         usage('at least one filename argument required')
 
-    # check that the script name ends in ".py"
-    if args[0][-3:] != ".py":
-        usage('the script name must have a .py suffix')
-
     # check that file arguments exist
     for arg in args:
+        if arg == '-m':
+            break
         if not os.path.exists(arg):
             usage('argument %s not found' % arg)
         if not os.path.isfile(arg):
             usage('%s: not a plain file' % arg)
+        if modargs:
+            break
 
     # process non-option arguments
     scriptfile = args[0]
@@ -238,6 +237,8 @@
     # Actual work starts here...
 
     # collect all modules of the program
+    dir = os.path.dirname(scriptfile)
+    path[0] = dir
     mf = modulefinder.ModuleFinder(path, debug)
     for mod in implicits:
         mf.import_hook(mod)