From 016880229a369a3fb419f3eed28b6db7c342fe71 Mon Sep 17 00:00:00 2001 From: Neal Norwitz Date: Sun, 12 Aug 2007 00:43:29 +0000 Subject: [PATCH] Kill execfile(), use exec() instead --- Demo/scripts/newslist.py | 2 +- Demo/scripts/pp.py | 5 +- Doc/dist/dist.tex | 2 +- Doc/howto/doanddont.tex | 6 +- Doc/lib/libdoctest.tex | 2 +- Doc/lib/libexcs.tex | 2 +- Doc/lib/libfuncs.tex | 31 +------ Doc/lib/libuser.tex | 2 +- Doc/ref/ref4.tex | 7 +- Doc/ref/ref6.tex | 7 +- Doc/tut/tut.tex | 14 +-- Lib/CGIHTTPServer.py | 2 +- Lib/cProfile.py | 7 +- Lib/distutils/core.py | 4 +- Lib/doctest.py | 13 +-- Lib/lib-tk/Tkinter.py | 8 +- Lib/optparse.py | 2 +- Lib/pdb.py | 7 +- Lib/plat-mac/appletrawmain.py | 2 +- Lib/plat-mac/bundlebuilder.py | 7 +- Lib/profile.py | 7 +- Lib/test/test_builtin.py | 55 ------------ Lib/test/test_multibytecodec.py | 2 +- Lib/test/test_pkg.py | 2 +- Lib/test/test_univnewlines.py | 7 -- Lib/trace.py | 7 +- Lib/user.py | 4 +- Mac/Modules/ae/aescan.py | 2 +- Mac/Modules/ae/aesupport.py | 4 +- Mac/Modules/ah/ahscan.py | 2 +- Mac/Modules/ah/ahsupport.py | 2 +- Mac/Modules/app/appscan.py | 2 +- Mac/Modules/app/appsupport.py | 2 +- Mac/Modules/carbonevt/CarbonEvtscan.py | 2 +- Mac/Modules/carbonevt/CarbonEvtsupport.py | 2 +- Mac/Modules/cf/cfscan.py | 2 +- Mac/Modules/cf/cfsupport.py | 2 +- Mac/Modules/cg/cgscan.py | 2 +- Mac/Modules/cg/cgsupport.py | 2 +- Mac/Modules/cm/cmscan.py | 2 +- Mac/Modules/cm/cmsupport.py | 2 +- Mac/Modules/ctl/ctlscan.py | 2 +- Mac/Modules/ctl/ctlsupport.py | 4 +- Mac/Modules/dlg/dlgscan.py | 2 +- Mac/Modules/dlg/dlgsupport.py | 2 +- Mac/Modules/drag/dragscan.py | 2 +- Mac/Modules/drag/dragsupport.py | 2 +- Mac/Modules/evt/evtscan.py | 2 +- Mac/Modules/evt/evtsupport.py | 2 +- Mac/Modules/file/filescan.py | 2 +- Mac/Modules/file/filesupport.py | 4 +- Mac/Modules/fm/fmscan.py | 2 +- Mac/Modules/fm/fmsupport.py | 2 +- Mac/Modules/folder/folderscan.py | 2 +- Mac/Modules/folder/foldersupport.py | 4 +- Mac/Modules/help/helpscan.py | 2 +- Mac/Modules/help/helpsupport.py | 2 +- Mac/Modules/ibcarbon/IBCarbonscan.py | 2 +- Mac/Modules/ibcarbon/IBCarbonsupport.py | 2 +- Mac/Modules/icn/icnscan.py | 2 +- Mac/Modules/icn/icnsupport.py | 2 +- Mac/Modules/launch/launchscan.py | 2 +- Mac/Modules/launch/launchsupport.py | 4 +- Mac/Modules/list/listscan.py | 2 +- Mac/Modules/list/listsupport.py | 2 +- Mac/Modules/menu/menuscan.py | 2 +- Mac/Modules/menu/menusupport.py | 4 +- Mac/Modules/mlte/mltescan.py | 2 +- Mac/Modules/mlte/mltesupport.py | 4 +- Mac/Modules/osa/osascan.py | 2 +- Mac/Modules/osa/osasupport.py | 4 +- Mac/Modules/qd/qdscan.py | 2 +- Mac/Modules/qd/qdsupport.py | 4 +- Mac/Modules/qdoffs/qdoffsscan.py | 2 +- Mac/Modules/qdoffs/qdoffssupport.py | 2 +- Mac/Modules/qt/qtscan.py | 2 +- Mac/Modules/qt/qtsupport.py | 4 +- Mac/Modules/res/resscan.py | 2 +- Mac/Modules/res/ressupport.py | 4 +- Mac/Modules/scrap/scrapscan.py | 2 +- Mac/Modules/scrap/scrapsupport.py | 2 +- Mac/Modules/snd/sndscan.py | 2 +- Mac/Modules/snd/sndsupport.py | 2 +- Mac/Modules/te/tescan.py | 2 +- Mac/Modules/te/tesupport.py | 2 +- Mac/Modules/win/winscan.py | 2 +- Mac/Modules/win/winsupport.py | 6 +- Misc/NEWS | 2 +- Misc/Vim/python.vim | 4 +- Misc/cheatsheet | 16 +--- Misc/python-mode.el | 12 +-- Objects/fileobject.c | 2 +- Python/bltinmodule.c | 102 ---------------------- README | 2 +- Tools/scripts/hotshotmain.py | 7 +- Tools/versioncheck/README | 2 +- Tools/versioncheck/checkversions.py | 2 +- setup.py | 7 +- 98 files changed, 179 insertions(+), 341 deletions(-) diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py index 7038380f5c0..3d65a083812 100755 --- a/Demo/scripts/newslist.py +++ b/Demo/scripts/newslist.py @@ -99,7 +99,7 @@ for dir in os.curdir, os.environ['HOME']: rcfile = os.path.join(dir, '.newslistrc.py') if os.path.exists(rcfile): print(rcfile) - execfile(rcfile) + exec(open(rcfile).read()) break from nntplib import NNTP diff --git a/Demo/scripts/pp.py b/Demo/scripts/pp.py index 486986ae34d..9010b7af4d3 100755 --- a/Demo/scripts/pp.py +++ b/Demo/scripts/pp.py @@ -123,8 +123,9 @@ import tempfile fp = tempfile.NamedTemporaryFile() fp.write(program) fp.flush() +script = open(tfn).read() if DFLAG: import pdb - pdb.run('execfile(%r)' % (tfn,)) + pdb.run(script) else: - execfile(tfn) + exec(script) diff --git a/Doc/dist/dist.tex b/Doc/dist/dist.tex index ff5106a1691..a33227f7109 100644 --- a/Doc/dist/dist.tex +++ b/Doc/dist/dist.tex @@ -2290,7 +2290,7 @@ This is useful if you need to find out the distribution meta-data (passed as keyword args from \var{script} to \function{setup()}), or the contents of the config files or command-line. -\var{script_name} is a file that will be run with \function{execfile()} +\var{script_name} is a file that will be read and run with \function{exec()} \code{sys.argv[0]} will be replaced with \var{script} for the duration of the call. \var{script_args} is a list of strings; if supplied, \code{sys.argv[1:]} will be replaced by \var{script_args} for the duration diff --git a/Doc/howto/doanddont.tex b/Doc/howto/doanddont.tex index 0cd5d912b93..b54f0690a3d 100644 --- a/Doc/howto/doanddont.tex +++ b/Doc/howto/doanddont.tex @@ -81,7 +81,7 @@ There are situations in which \code{from module import *} is just fine: \end{itemize} -\subsection{Unadorned \function{exec}, \function{execfile} and friends} +\subsection{Unadorned \function{exec} and friends} The word ``unadorned'' refers to the use without an explicit dictionary, in which case those constructs evaluate code in the {\em current} environment. @@ -97,7 +97,7 @@ Bad examples: >>> def func(s, **kw): >>> for var, val in kw.items(): >>> exec("s.%s=val" % var) # invalid! ->>> execfile("handler.py") +>>> exec(open("handler.py").read()) >>> handle() \end{verbatim} @@ -111,7 +111,7 @@ Good examples: >>> for var, val in kw.items(): >>> setattr(s, var, val) >>> d={} ->>> execfile("handle.py", d, d) +>>> exec(open("handler.py").read(), d, d) >>> handle = d['handle'] >>> handle() \end{verbatim} diff --git a/Doc/lib/libdoctest.tex b/Doc/lib/libdoctest.tex index 5e28c2acc0c..9143b8486b0 100644 --- a/Doc/lib/libdoctest.tex +++ b/Doc/lib/libdoctest.tex @@ -1828,7 +1828,7 @@ print doctest.testsource(a, "a.f") via \function{\refmodule{pdb}.post_mortem()}, passing the traceback object from the unhandled exception. If \var{pm} is not specified, or is false, the script is run under the debugger from the start, via passing an - appropriate \function{execfile()} call to \function{\refmodule{pdb}.run()}. + appropriate \function{exec()} call to \function{\refmodule{pdb}.run()}. \versionadded{2.3} diff --git a/Doc/lib/libexcs.tex b/Doc/lib/libexcs.tex index 298f04dcfd8..74531d3a4d5 100644 --- a/Doc/lib/libexcs.tex +++ b/Doc/lib/libexcs.tex @@ -260,7 +260,7 @@ Raised when an \keyword{assert} statement fails. % XXXJH xref to these functions? Raised when the parser encounters a syntax error. This may occur in an \keyword{import} statement, in a call to the built-in functions - \function{exec()}, \function{execfile()}, \function{eval()} or + \function{exec()}, \function{eval()} or \function{input()}, or when reading the initial script or standard input (also interactively). diff --git a/Doc/lib/libfuncs.tex b/Doc/lib/libfuncs.tex index 3cc06c85216..0b99c3fd499 100644 --- a/Doc/lib/libfuncs.tex +++ b/Doc/lib/libfuncs.tex @@ -382,15 +382,13 @@ class C: compiled passing \code{'eval'} as the \var{kind} argument. Hints: dynamic execution of statements is supported by the - \function{exec()} function. Execution of statements from a file is - supported by the \function{execfile()} function. The + \function{exec()} function. The \function{globals()} and \function{locals()} functions returns the current global and local dictionary, respectively, which may be useful to pass around for use by \function{eval()} or - \function{execfile()}. + \function{exec()}. \end{funcdesc} - \begin{funcdesc}{exec}{object\optional{, globals\optional{, locals}}} This function supports dynamic execution of Python code. \var{object} must be either a string, an open file object, or @@ -425,31 +423,6 @@ class C: argument to \function{exec()}.} \end{funcdesc} -\begin{funcdesc}{execfile}{filename\optional{, globals\optional{, locals}}} - This function is similar to the \function{exec()} function, but parses a - file given by the file name instead of a string. It - is different from the \keyword{import} statement in that it does not - use the module administration --- it reads the file unconditionally - and does not create a new module. - - The arguments are a file name and two optional dictionaries. The file is - parsed and evaluated as a sequence of Python statements (similarly to a - module) using the \var{globals} and \var{locals} dictionaries as global and - local namespace. If provided, \var{locals} can be any mapping object. - \versionchanged[formerly \var{locals} was required to be a dictionary]{2.4} - If the \var{locals} dictionary is omitted it defaults to the \var{globals} - dictionary. If both dictionaries are omitted, the expression is executed in - the environment where \function{execfile()} is called. The return value is - \code{None}. - - \warning{The default \var{locals} act as described for function - \function{locals()} below: modifications to the default \var{locals} - dictionary should not be attempted. Pass an explicit \var{locals} - dictionary if you need to see effects of the code on \var{locals} after - function \function{execfile()} returns. \function{execfile()} cannot - be used reliably to modify a function's locals.} -\end{funcdesc} - \begin{funcdesc}{file}{filename\optional{, mode\optional{, bufsize}}} Constructor function for the \class{file} type, described further in section~\ref{bltin-file-objects}, ``\ulink{File diff --git a/Doc/lib/libuser.tex b/Doc/lib/libuser.tex index 4e915a22c88..6dd1546f02e 100644 --- a/Doc/lib/libuser.tex +++ b/Doc/lib/libuser.tex @@ -24,7 +24,7 @@ import user The \module{user} module looks for a file \file{.pythonrc.py} in the user's home directory and if it can be opened, executes it (using -\function{execfile()}\bifuncindex{execfile}) in its own (the +\function{exec()}\bifuncindex{exec}) in its own (the module \module{user}'s) global namespace. Errors during this phase are not caught; that's up to the program that imports the \module{user} module, if it wishes. The home directory is assumed to diff --git a/Doc/ref/ref4.tex b/Doc/ref/ref4.tex index 9ae8bfaea06..6ec60f8c128 100644 --- a/Doc/ref/ref4.tex +++ b/Doc/ref/ref4.tex @@ -19,8 +19,7 @@ block. A script file (a file given as standard input to the interpreter or specified on the interpreter command line the first argument) is a code block. A script command (a command specified on the interpreter command line with the `\strong{-c}' option) is a code -block. The file read by the built-in function \function{execfile()} -is a code block. The string argument passed to the built-in functions +block. The string argument passed to the built-in functions \function{eval()} and \function{exec()} is a code block. The expression read and evaluated by the built-in function \function{input()} is a code block. @@ -139,7 +138,7 @@ If the wild card form of import --- \samp{import *} --- is used in a function and the function contains or is a nested block with free variables, the compiler will raise a \exception{SyntaxError}. -The \function{eval()}, \function{exec()}, \function{execfile()}, +The \function{eval()}, \function{exec()}, and \function{input()} functions do not have access to the full environment for resolving names. Names may be resolved in the local and global namespaces of the caller. Free variables are not @@ -147,7 +146,7 @@ resolved in the nearest enclosing namespace, but in the global namespace.\footnote{This limitation occurs because the code that is executed by these operations is not available at the time the module is compiled.} -The \function{exec()}, \function{eval()} and \function{execfile()} +The \function{exec()} and \function{eval()} functions have optional arguments to override the global and local namespace. If only one namespace is specified, it is used for both. diff --git a/Doc/ref/ref6.tex b/Doc/ref/ref6.tex index 60e7b02bec6..11390056b2e 100644 --- a/Doc/ref/ref6.tex +++ b/Doc/ref/ref6.tex @@ -760,8 +760,8 @@ import __future__ [as name] That is not a future statement; it's an ordinary import statement with no special semantics or syntax restrictions. -Code compiled by calls to the builtin functions \function{exec()}, -\function{compile()} and \function{execfile()} that occur in a module +Code compiled by calls to the builtin functions \function{exec()} and +\function{compile()} that occur in a module \module{M} containing a future statement will, by default, use the new syntax or semantics associated with the future statement. This can, starting with Python 2.2 be controlled by optional arguments to @@ -811,9 +811,8 @@ string or code object supplied to the builtin \function{exec()} function does not affect the code block \emph{containing} the function call, and code contained in such a string is unaffected by \keyword{global} statements in the code containing the function call. The same applies to the -\function{eval()}, \function{execfile()} and \function{compile()} functions. +\function{eval()} and \function{compile()} functions. \bifuncindex{exec} \bifuncindex{eval} -\bifuncindex{execfile} \bifuncindex{compile} diff --git a/Doc/tut/tut.tex b/Doc/tut/tut.tex index 74468b1b9f4..b39cd473bca 100644 --- a/Doc/tut/tut.tex +++ b/Doc/tut/tut.tex @@ -409,14 +409,14 @@ this file. If you want to read an additional start-up file from the current directory, you can program this in the global start-up file using code like \samp{if os.path.isfile('.pythonrc.py'): -execfile('.pythonrc.py')}. If you want to use the startup file in a +exec(open('.pythonrc.py')).read()}. If you want to use the startup file in a script, you must do this explicitly in the script: \begin{verbatim} import os filename = os.environ.get('PYTHONSTARTUP') if filename and os.path.isfile(filename): - execfile(filename) + exec(open(filename).read()) \end{verbatim} @@ -2736,14 +2736,14 @@ standard module \module{__builtin__}\refbimodindex{__builtin__}: '__name__', 'abs', 'basestring', 'bool', 'buffer', 'chr', 'classmethod', 'cmp', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', - 'enumerate', 'eval', 'execfile', 'exit', 'file', 'filter', 'float', + 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', - 'len', 'license', 'list', 'locals', 'long', 'map', 'max', 'min', + 'len', 'license', 'list', 'locals', 'map', 'max', 'min', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', - 'tuple', 'type', 'unichr', 'unicode', 'vars', 'zip'] + 'tuple', 'type', 'vars', 'zip'] \end{verbatim} @@ -4413,8 +4413,8 @@ the debugger, and that's one reason why this loophole is not closed. (Buglet: derivation of a class with the same name as the base class makes use of private variables of the base class possible.) -Notice that code passed to \code{exec()}, \code{eval()} or -\code{execfile()} does not consider the classname of the invoking +Notice that code passed to \code{exec()} or \code{eval()} +does not consider the classname of the invoking class to be the current class; this is similar to the effect of the \code{global} statement, the effect of which is likewise restricted to code that is byte-compiled together. The same restriction applies to diff --git a/Lib/CGIHTTPServer.py b/Lib/CGIHTTPServer.py index a2d809c14c6..828b092496b 100644 --- a/Lib/CGIHTTPServer.py +++ b/Lib/CGIHTTPServer.py @@ -316,7 +316,7 @@ class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): sys.argv.append(decoded_query) sys.stdout = self.wfile sys.stdin = self.rfile - execfile(scriptfile, {"__name__": "__main__"}) + exec(open(scriptfile).read(), {"__name__": "__main__"}) finally: sys.argv = save_argv sys.stdin = save_stdin diff --git a/Lib/cProfile.py b/Lib/cProfile.py index d10b7ab9f7b..ae16277bcbf 100755 --- a/Lib/cProfile.py +++ b/Lib/cProfile.py @@ -180,7 +180,12 @@ def main(): if (len(sys.argv) > 0): sys.path.insert(0, os.path.dirname(sys.argv[0])) - run('execfile(%r)' % (sys.argv[0],), options.outfile, options.sort) + fp = open(sys.argv[0]) + try: + script = fp.read() + finally: + fp.close() + run('exec(%r)' % script, options.outfile, options.sort) else: parser.print_usage() return parser diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py index bd9b8542cd4..d60998240f8 100644 --- a/Lib/distutils/core.py +++ b/Lib/distutils/core.py @@ -179,7 +179,7 @@ def run_setup (script_name, script_args=None, stop_after="run"): keyword args from 'script' to 'setup()', or the contents of the config files or command-line. - 'script_name' is a file that will be run with 'execfile()'; + 'script_name' is a file that will be read and run with 'exec()'; 'sys.argv[0]' will be replaced with 'script' for the duration of the call. 'script_args' is a list of strings; if supplied, 'sys.argv[1:]' will be replaced by 'script_args' for the duration of @@ -217,7 +217,7 @@ def run_setup (script_name, script_args=None, stop_after="run"): sys.argv[0] = script_name if script_args is not None: sys.argv[1:] = script_args - execfile(script_name, g, l) + exec(open(script_name).read(), g, l) finally: sys.argv = save_argv _setup_stop_after = None diff --git a/Lib/doctest.py b/Lib/doctest.py index 0f408185f0b..ec516574195 100644 --- a/Lib/doctest.py +++ b/Lib/doctest.py @@ -2490,7 +2490,7 @@ def debug_script(src, pm=False, globs=None): # Note that tempfile.NameTemporaryFile() cannot be used. As the # docs say, a file so created cannot be opened by name a second time - # on modern Windows boxes, and execfile() needs to open it. + # on modern Windows boxes, and exec() needs to open and read it. srcfilename = tempfile.mktemp(".py", "doctestdebug") f = open(srcfilename, 'w') f.write(src) @@ -2504,14 +2504,17 @@ def debug_script(src, pm=False, globs=None): if pm: try: - execfile(srcfilename, globs, globs) + exec(open(srcfilename).read(), globs, globs) except: print(sys.exc_info()[1]) pdb.post_mortem(sys.exc_info()[2]) else: - # Note that %r is vital here. '%s' instead can, e.g., cause - # backslashes to get treated as metacharacters on Windows. - pdb.run("execfile(%r)" % srcfilename, globs, globs) + fp = open(srcfilename) + try: + script = fp.read() + finally: + fp.close() + pdb.run("exec(%r)" % script, globs, globs) finally: os.remove(srcfilename) diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py index ef588e87bc1..144be0a1a88 100644 --- a/Lib/lib-tk/Tkinter.py +++ b/Lib/lib-tk/Tkinter.py @@ -1688,8 +1688,8 @@ class Tk(Misc, Wm): _default_root = None def readprofile(self, baseName, className): """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into - the Tcl Interpreter and calls execfile on BASENAME.py and CLASSNAME.py if - such a file exists in the home directory.""" + the Tcl Interpreter and calls exec on the contents of BASENAME.py and + CLASSNAME.py if such a file exists in the home directory.""" import os if 'HOME' in os.environ: home = os.environ['HOME'] else: home = os.curdir @@ -1702,11 +1702,11 @@ class Tk(Misc, Wm): if os.path.isfile(class_tcl): self.tk.call('source', class_tcl) if os.path.isfile(class_py): - execfile(class_py, dir) + exec(open(class_py).read(), dir) if os.path.isfile(base_tcl): self.tk.call('source', base_tcl) if os.path.isfile(base_py): - execfile(base_py, dir) + exec(open(base_py).read(), dir) def report_callback_exception(self, exc, val, tb): """Internal function. It reports exception on sys.stderr.""" import traceback, sys diff --git a/Lib/optparse.py b/Lib/optparse.py index 84a6abd1927..bae10500d34 100644 --- a/Lib/optparse.py +++ b/Lib/optparse.py @@ -874,7 +874,7 @@ class Values: def read_file(self, filename, mode="careful"): vars = {} - execfile(filename, vars) + exec(open(filename).read(), vars) self._update(vars, mode) def ensure_value(self, attr, value): diff --git a/Lib/pdb.py b/Lib/pdb.py index f408bf3a460..3bbf76b25de 100755 --- a/Lib/pdb.py +++ b/Lib/pdb.py @@ -1164,7 +1164,12 @@ see no sign that the breakpoint was reached. self._wait_for_mainpyfile = 1 self.mainpyfile = self.canonic(filename) self._user_requested_quit = 0 - statement = 'execfile( "%s")' % filename + fp = open(filename) + try: + script = fp.read() + finally: + fp.close() + statement = 'exec("%s")' % script self.run(statement) # Simplified interface diff --git a/Lib/plat-mac/appletrawmain.py b/Lib/plat-mac/appletrawmain.py index 6f2eacb20f0..5c09e2d124d 100644 --- a/Lib/plat-mac/appletrawmain.py +++ b/Lib/plat-mac/appletrawmain.py @@ -41,7 +41,7 @@ if os.path.exists(__file__): # sys.argv[0] = __file__ del argvemulator, os, sys, _dir - execfile(__file__) + exec(open(__file__).read()) else: __file__ = os.path.join(_dir, '__main__.pyc') if os.path.exists(__file__): diff --git a/Lib/plat-mac/bundlebuilder.py b/Lib/plat-mac/bundlebuilder.py index e833addb11b..d8186c1d7d2 100755 --- a/Lib/plat-mac/bundlebuilder.py +++ b/Lib/plat-mac/bundlebuilder.py @@ -322,7 +322,12 @@ ARGV_EMULATOR = """\ import argvemulator, os argvemulator.ArgvCollector().mainloop() -execfile(os.path.join(os.path.split(__file__)[0], "%(realmainprogram)s")) +fp = os.path.join(os.path.split(__file__)[0], "%(realmainprogram)s") +try: + script = fp.read() +finally: + fp.close() +exec(script) """ # diff --git a/Lib/profile.py b/Lib/profile.py index 55118b59606..cdc247911bc 100755 --- a/Lib/profile.py +++ b/Lib/profile.py @@ -609,7 +609,12 @@ def main(): if (len(sys.argv) > 0): sys.path.insert(0, os.path.dirname(sys.argv[0])) - run('execfile(%r)' % (sys.argv[0],), options.outfile, options.sort) + fp = open(sys.argv[0]) + try: + script = fp.read() + finally: + fp.close() + run('exec(%r)' % script, options.outfile, options.sort) else: parser.print_usage() return parser diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py index a4ae21aa5dd..b43082212d1 100644 --- a/Lib/test/test_builtin.py +++ b/Lib/test/test_builtin.py @@ -11,10 +11,6 @@ warnings.filterwarnings("ignore", "hex../oct.. of negative int", warnings.filterwarnings("ignore", "integer argument expected", DeprecationWarning, "unittest") -# count the number of test runs. -# used to skip running test_execfile() multiple times -numruns = 0 - class Squares: def __init__(self, max): @@ -399,57 +395,6 @@ class BuiltinTest(unittest.TestCase): return 1 # used to be 'a' but that's no longer an error self.assertRaises(TypeError, eval, 'dir()', globals(), C()) - # Done outside of the method test_z to get the correct scope - z = 0 - f = open(TESTFN, 'w') - f.write('z = z+1\n') - f.write('z = z*2\n') - f.close() - execfile(TESTFN) - - def test_execfile(self): - global numruns - if numruns: - return - numruns += 1 - - globals = {'a': 1, 'b': 2} - locals = {'b': 200, 'c': 300} - - self.assertEqual(self.__class__.z, 2) - globals['z'] = 0 - execfile(TESTFN, globals) - self.assertEqual(globals['z'], 2) - locals['z'] = 0 - execfile(TESTFN, globals, locals) - self.assertEqual(locals['z'], 2) - - class M: - "Test mapping interface versus possible calls from execfile()." - def __init__(self): - self.z = 10 - def __getitem__(self, key): - if key == 'z': - return self.z - raise KeyError - def __setitem__(self, key, value): - if key == 'z': - self.z = value - return - raise KeyError - - locals = M() - locals['z'] = 0 - execfile(TESTFN, globals, locals) - self.assertEqual(locals['z'], 2) - - unlink(TESTFN) - self.assertRaises(TypeError, execfile) - self.assertRaises(TypeError, execfile, TESTFN, {}, ()) - import os - self.assertRaises(IOError, execfile, os.curdir) - self.assertRaises(IOError, execfile, "I_dont_exist") - def test_exec(self): g = {} exec('z = 1', g) diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py index 32c48fbd931..c2f34e593fa 100644 --- a/Lib/test/test_multibytecodec.py +++ b/Lib/test/test_multibytecodec.py @@ -49,7 +49,7 @@ class Test_MultibyteCodec(unittest.TestCase): try: for enc in ALL_CJKENCODINGS: print('# coding:', enc, file=io.open(TESTFN, 'w')) - execfile(TESTFN) + exec(open(TESTFN).read()) finally: test_support.unlink(TESTFN) diff --git a/Lib/test/test_pkg.py b/Lib/test/test_pkg.py index 1a3f2a96b91..907359b5b7c 100644 --- a/Lib/test/test_pkg.py +++ b/Lib/test/test_pkg.py @@ -63,7 +63,7 @@ def runtest(hier, code): sys.path.insert(0, root) if verbose: print("sys.path =", sys.path) try: - execfile(fname, globals(), {}) + exec(open(fname).read(), globals(), {}) except: traceback.print_exc(file=sys.stdout) finally: diff --git a/Lib/test/test_univnewlines.py b/Lib/test/test_univnewlines.py index ae4c4421c73..7810caef8c4 100644 --- a/Lib/test/test_univnewlines.py +++ b/Lib/test/test_univnewlines.py @@ -78,13 +78,6 @@ class TestGenericUnivNewlines(unittest.TestCase): data = fp.readlines() self.assertEqual(data, DATA_SPLIT[1:]) - def test_execfile(self): - namespace = {} - execfile(test_support.TESTFN, namespace) - func = namespace['line3'] - self.assertEqual(func.__code__.co_firstlineno, 3) - self.assertEqual(namespace['line4'], FATX) - class TestNativeNewlines(TestGenericUnivNewlines): NEWLINE = None diff --git a/Lib/trace.py b/Lib/trace.py index d40f13c2320..645517a75fc 100644 --- a/Lib/trace.py +++ b/Lib/trace.py @@ -773,7 +773,12 @@ def main(argv=None): ignoredirs=ignore_dirs, infile=counts_file, outfile=counts_file) try: - t.run('execfile(%r)' % (progname,)) + fp = open(progname) + try: + script = fp.read() + finally: + fp.close() + t.run('exec(%r)' % (script,)) except IOError as err: _err_exit("Cannot run file %r because: %s" % (sys.argv[0], err)) except SystemExit: diff --git a/Lib/user.py b/Lib/user.py index e550e52ad80..99efd2d2406 100644 --- a/Lib/user.py +++ b/Lib/user.py @@ -12,7 +12,7 @@ that wishes to use the mechanism must execute the statement import user The user module looks for a file .pythonrc.py in the user's home -directory and if it can be opened, execfile()s it in its own global +directory and if it can be opened and read, exec()s it in its own global namespace. Errors during this phase are not caught; that's up to the program that imports the user module, if it wishes. @@ -42,4 +42,4 @@ except IOError: pass else: f.close() - execfile(pythonrc) + exec(open(pythonrc).read()) diff --git a/Mac/Modules/ae/aescan.py b/Mac/Modules/ae/aescan.py index 1283c1dcd25..0ea367c82fe 100644 --- a/Mac/Modules/ae/aescan.py +++ b/Mac/Modules/ae/aescan.py @@ -21,7 +21,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done Scanning and Generating, now doing 'import aesupport' ===" import aesupport print "=== Done 'import aesupport'. It's up to you to compile AEmodule.c ===" diff --git a/Mac/Modules/ae/aesupport.py b/Mac/Modules/ae/aesupport.py index 91c5b82efe0..d3e1dfd0912 100644 --- a/Mac/Modules/ae/aesupport.py +++ b/Mac/Modules/ae/aesupport.py @@ -213,8 +213,8 @@ module.addobject(aedescobject) functions = [] aedescmethods = [] -execfile('aegen.py') -##execfile('aedatamodelgen.py') +exec(open('aegen.py').read()) +##exec(open('aedatamodelgen.py').read()) # Manual generator AutoDispose_body = """ diff --git a/Mac/Modules/ah/ahscan.py b/Mac/Modules/ah/ahscan.py index 0b7fe081f86..8768b60b315 100644 --- a/Mac/Modules/ah/ahscan.py +++ b/Mac/Modules/ah/ahscan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/ah/ahsupport.py b/Mac/Modules/ah/ahsupport.py index c5f24beeeab..9fa9dde2d78 100644 --- a/Mac/Modules/ah/ahsupport.py +++ b/Mac/Modules/ah/ahsupport.py @@ -34,7 +34,7 @@ Function = OSErrFunctionGenerator # Create and populate the lists functions = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/app/appscan.py b/Mac/Modules/app/appscan.py index 1b04859ef2d..246d61ee2b2 100644 --- a/Mac/Modules/app/appscan.py +++ b/Mac/Modules/app/appscan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/app/appsupport.py b/Mac/Modules/app/appsupport.py index 177dfd55f5b..73f5f1133ab 100644 --- a/Mac/Modules/app/appsupport.py +++ b/Mac/Modules/app/appsupport.py @@ -121,7 +121,7 @@ Function = OSErrWeakLinkFunctionGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/carbonevt/CarbonEvtscan.py b/Mac/Modules/carbonevt/CarbonEvtscan.py index e3c72ae23de..7307327fa85 100644 --- a/Mac/Modules/carbonevt/CarbonEvtscan.py +++ b/Mac/Modules/carbonevt/CarbonEvtscan.py @@ -20,7 +20,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "--done scanning, importing--" import CarbonEvtsupport print "done" diff --git a/Mac/Modules/carbonevt/CarbonEvtsupport.py b/Mac/Modules/carbonevt/CarbonEvtsupport.py index 77d12b62990..2adc8cbfc0e 100644 --- a/Mac/Modules/carbonevt/CarbonEvtsupport.py +++ b/Mac/Modules/carbonevt/CarbonEvtsupport.py @@ -214,7 +214,7 @@ for typ in RefObjectTypes: ## go thru all ObjectTypes as defined in CarbonEvents execstr = typ + 'methods = []' exec execstr -execfile('CarbonEventsgen.py') +exec(open('CarbonEventsgen.py').read()) diff --git a/Mac/Modules/cf/cfscan.py b/Mac/Modules/cf/cfscan.py index d2de92e2da4..5ff9534bde4 100644 --- a/Mac/Modules/cf/cfscan.py +++ b/Mac/Modules/cf/cfscan.py @@ -45,7 +45,7 @@ def main(): scanner.gentypetest(SHORT+"typetest.py") scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/cf/cfsupport.py b/Mac/Modules/cf/cfsupport.py index 800581a03e3..655331eb2a8 100644 --- a/Mac/Modules/cf/cfsupport.py +++ b/Mac/Modules/cf/cfsupport.py @@ -529,7 +529,7 @@ CFMutableStringRef_methods = [] CFURLRef_methods = [] # ADD _methods initializer here -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups diff --git a/Mac/Modules/cg/cgscan.py b/Mac/Modules/cg/cgscan.py index b2e79461953..82f49191583 100755 --- a/Mac/Modules/cg/cgscan.py +++ b/Mac/Modules/cg/cgscan.py @@ -23,7 +23,7 @@ def main(): scanner.gentypetest(SHORT+"typetest.py") scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/cg/cgsupport.py b/Mac/Modules/cg/cgsupport.py index 6eedfbef3f7..7fa06e2ac0c 100755 --- a/Mac/Modules/cg/cgsupport.py +++ b/Mac/Modules/cg/cgsupport.py @@ -145,7 +145,7 @@ Method = MethodGenerator CGContextRef_methods = [] # ADD _methods initializer here -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # manual method, lives in Quickdraw.h f = Method(void, 'SyncCGContextOriginWithPort', diff --git a/Mac/Modules/cm/cmscan.py b/Mac/Modules/cm/cmscan.py index 087f2393df6..1a1e46d6f23 100644 --- a/Mac/Modules/cm/cmscan.py +++ b/Mac/Modules/cm/cmscan.py @@ -17,7 +17,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/cm/cmsupport.py b/Mac/Modules/cm/cmsupport.py index 4109dbabaad..1653bb3ab20 100644 --- a/Mac/Modules/cm/cmsupport.py +++ b/Mac/Modules/cm/cmsupport.py @@ -112,7 +112,7 @@ Method = OSErrWeakLinkMethodGenerator functions = [] c_methods = [] ci_methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/ctl/ctlscan.py b/Mac/Modules/ctl/ctlscan.py index 25333f1fa07..dd74d238f83 100644 --- a/Mac/Modules/ctl/ctlscan.py +++ b/Mac/Modules/ctl/ctlscan.py @@ -15,7 +15,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now doing 'import ctlsupport' ===" import ctlsupport print "=== Done. It's up to you to compile Ctlmodule.c ===" diff --git a/Mac/Modules/ctl/ctlsupport.py b/Mac/Modules/ctl/ctlsupport.py index d354d94276c..04fac8be5b2 100644 --- a/Mac/Modules/ctl/ctlsupport.py +++ b/Mac/Modules/ctl/ctlsupport.py @@ -507,8 +507,8 @@ Method = OSErrWeakLinkMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) -execfile('ctledit.py') +exec(open(INPUTFILE).read()) +exec(open('ctledit.py').read()) # add the populated lists to the generator groups for f in functions: module.add(f) diff --git a/Mac/Modules/dlg/dlgscan.py b/Mac/Modules/dlg/dlgscan.py index 7fb68f7cb1f..bf37129b9e9 100644 --- a/Mac/Modules/dlg/dlgscan.py +++ b/Mac/Modules/dlg/dlgscan.py @@ -19,7 +19,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/dlg/dlgsupport.py b/Mac/Modules/dlg/dlgsupport.py index fa1442ec37b..fcff5c03f8b 100644 --- a/Mac/Modules/dlg/dlgsupport.py +++ b/Mac/Modules/dlg/dlgsupport.py @@ -240,7 +240,7 @@ Method = OSErrWeakLinkMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile("dlggen.py") +exec(open("dlggen.py").read()) # add the populated lists to the generator groups for f in functions: module.add(f) diff --git a/Mac/Modules/drag/dragscan.py b/Mac/Modules/drag/dragscan.py index 923a56bd4dd..e89897a5624 100644 --- a/Mac/Modules/drag/dragscan.py +++ b/Mac/Modules/drag/dragscan.py @@ -26,7 +26,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now doing 'import dragsupport' ===" import dragsupport print "=== Done. It's up to you to compile Dragmodule.c ===" diff --git a/Mac/Modules/drag/dragsupport.py b/Mac/Modules/drag/dragsupport.py index 45838efde66..bb1a9188c67 100644 --- a/Mac/Modules/drag/dragsupport.py +++ b/Mac/Modules/drag/dragsupport.py @@ -216,7 +216,7 @@ Method = OSErrWeakLinkMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups for f in functions: module.add(f) diff --git a/Mac/Modules/evt/evtscan.py b/Mac/Modules/evt/evtscan.py index 0d0c9ec4df2..0adce8b1551 100644 --- a/Mac/Modules/evt/evtscan.py +++ b/Mac/Modules/evt/evtscan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/evt/evtsupport.py b/Mac/Modules/evt/evtsupport.py index f58da14a661..8deef928156 100644 --- a/Mac/Modules/evt/evtsupport.py +++ b/Mac/Modules/evt/evtsupport.py @@ -50,7 +50,7 @@ Function = OSErrWeakLinkFunctionGenerator # Create and populate the lists functions = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # Move TickCount here, for convenience f = Function(UInt32, 'TickCount', diff --git a/Mac/Modules/file/filescan.py b/Mac/Modules/file/filescan.py index 8ebc69fe4e0..b7c5d121e4c 100644 --- a/Mac/Modules/file/filescan.py +++ b/Mac/Modules/file/filescan.py @@ -18,7 +18,7 @@ def main(): scanner.close() scanner.gentypetest(SHORT+"typetest.py") print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/file/filesupport.py b/Mac/Modules/file/filesupport.py index 37aeb508a09..de45ed40420 100644 --- a/Mac/Modules/file/filesupport.py +++ b/Mac/Modules/file/filesupport.py @@ -340,7 +340,7 @@ PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSSpec, PyMac_GetFSSpec); PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSRef, PyMac_GetFSRef); """ -execfile(string.lower(MODPREFIX) + 'typetest.py') +exec(open(string.lower(MODPREFIX) + 'typetest.py').read()) # Our object types: class FSCatalogInfoDefinition(PEP253Mixin, ObjectDefinition): @@ -806,7 +806,7 @@ functions = [] alias_methods = [] fsref_methods = [] fsspec_methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # Manual generators: FSRefMakePath_body = """ diff --git a/Mac/Modules/fm/fmscan.py b/Mac/Modules/fm/fmscan.py index 334d5eca156..38abcacf98b 100644 --- a/Mac/Modules/fm/fmscan.py +++ b/Mac/Modules/fm/fmscan.py @@ -17,7 +17,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/fm/fmsupport.py b/Mac/Modules/fm/fmsupport.py index e69205316c7..8e2b8b31fa1 100644 --- a/Mac/Modules/fm/fmsupport.py +++ b/Mac/Modules/fm/fmsupport.py @@ -70,7 +70,7 @@ Function = OSErrWeakLinkFunctionGenerator # Create and populate the lists functions = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/folder/folderscan.py b/Mac/Modules/folder/folderscan.py index 8c94893011f..cccb720adb8 100644 --- a/Mac/Modules/folder/folderscan.py +++ b/Mac/Modules/folder/folderscan.py @@ -19,7 +19,7 @@ def main(): scanner.close() scanner.gentypetest(SHORT+"typetest.py") print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/folder/foldersupport.py b/Mac/Modules/folder/foldersupport.py index b9b64bfb01a..224b5453efb 100644 --- a/Mac/Modules/folder/foldersupport.py +++ b/Mac/Modules/folder/foldersupport.py @@ -33,7 +33,7 @@ includestuff = includestuff + """ """ -execfile(string.lower(MODPREFIX) + 'typetest.py') +exec(open(string.lower(MODPREFIX) + 'typetest.py').read()) # From here on it's basically all boiler plate... @@ -45,7 +45,7 @@ Function = OSErrFunctionGenerator # Create and populate the lists functions = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/help/helpscan.py b/Mac/Modules/help/helpscan.py index 50e0919dc52..fa8dbde986b 100644 --- a/Mac/Modules/help/helpscan.py +++ b/Mac/Modules/help/helpscan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/help/helpsupport.py b/Mac/Modules/help/helpsupport.py index 77f5c2ecc90..37117ee142b 100644 --- a/Mac/Modules/help/helpsupport.py +++ b/Mac/Modules/help/helpsupport.py @@ -66,7 +66,7 @@ Function = OSErrFunctionGenerator # Create and populate the lists functions = [] ##methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/ibcarbon/IBCarbonscan.py b/Mac/Modules/ibcarbon/IBCarbonscan.py index 84e4f1e6725..eb7267de150 100644 --- a/Mac/Modules/ibcarbon/IBCarbonscan.py +++ b/Mac/Modules/ibcarbon/IBCarbonscan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "--done scanning, importing--" import IBCarbonsupport print "done" diff --git a/Mac/Modules/ibcarbon/IBCarbonsupport.py b/Mac/Modules/ibcarbon/IBCarbonsupport.py index 5f4132840e2..8744b69bccc 100644 --- a/Mac/Modules/ibcarbon/IBCarbonsupport.py +++ b/Mac/Modules/ibcarbon/IBCarbonsupport.py @@ -42,7 +42,7 @@ module.addobject(ibnibobject) functions = [] methods = [] -execfile('IBCarbongen.py') +exec(open('IBCarbongen.py').read()) for f in functions: module.add(f) for m in methods: ibnibobject.add(m) diff --git a/Mac/Modules/icn/icnscan.py b/Mac/Modules/icn/icnscan.py index bdc3b84413e..2d20062bf2f 100644 --- a/Mac/Modules/icn/icnscan.py +++ b/Mac/Modules/icn/icnscan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/icn/icnsupport.py b/Mac/Modules/icn/icnsupport.py index 1b153854bd2..e9a8b78c5cb 100644 --- a/Mac/Modules/icn/icnsupport.py +++ b/Mac/Modules/icn/icnsupport.py @@ -78,7 +78,7 @@ Function = OSErrWeakLinkFunctionGenerator # Create and populate the lists functions = [] ##methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/launch/launchscan.py b/Mac/Modules/launch/launchscan.py index 621033ba87b..dd43e375526 100644 --- a/Mac/Modules/launch/launchscan.py +++ b/Mac/Modules/launch/launchscan.py @@ -19,7 +19,7 @@ def main(): scanner.close() scanner.gentypetest(SHORT+"typetest.py") print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/launch/launchsupport.py b/Mac/Modules/launch/launchsupport.py index 34c2efbcfd5..5faf4b3fa00 100644 --- a/Mac/Modules/launch/launchsupport.py +++ b/Mac/Modules/launch/launchsupport.py @@ -75,7 +75,7 @@ LSItemInfoRecord_New(LSItemInfoRecord *it) """ # From here on it's basically all boiler plate... -execfile(string.lower(MODPREFIX) + 'typetest.py') +exec(open(string.lower(MODPREFIX) + 'typetest.py').read()) # Create the generator groups and link them module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) @@ -89,7 +89,7 @@ Function = OSErrFunctionGenerator # Create and populate the lists functions = [] ##methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/list/listscan.py b/Mac/Modules/list/listscan.py index 877f6cb48bc..14e7dcac28b 100644 --- a/Mac/Modules/list/listscan.py +++ b/Mac/Modules/list/listscan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/list/listsupport.py b/Mac/Modules/list/listsupport.py index 93baede806a..2e1144a9b64 100644 --- a/Mac/Modules/list/listsupport.py +++ b/Mac/Modules/list/listsupport.py @@ -169,7 +169,7 @@ Method = ListMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # Function to convert any handle to a list and vv. ##f = Function(ListHandle, 'as_List', (Handle, 'h', InMode)) diff --git a/Mac/Modules/menu/menuscan.py b/Mac/Modules/menu/menuscan.py index ae9465ea142..46afe16532f 100644 --- a/Mac/Modules/menu/menuscan.py +++ b/Mac/Modules/menu/menuscan.py @@ -14,7 +14,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now doing 'import menusupport' ===" import menusupport print "=== Done. It's up to you to compile Menumodule.c ===" diff --git a/Mac/Modules/menu/menusupport.py b/Mac/Modules/menu/menusupport.py index a04b7553cb2..93d489b5ea1 100644 --- a/Mac/Modules/menu/menusupport.py +++ b/Mac/Modules/menu/menusupport.py @@ -96,8 +96,8 @@ Method = OSErrWeakLinkMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) -execfile(EXTRAFILE) +exec(open(INPUTFILE).read()) +exec(open(EXTRAFILE).read()) # add the populated lists to the generator groups for f in functions: module.add(f) diff --git a/Mac/Modules/mlte/mltescan.py b/Mac/Modules/mlte/mltescan.py index adecb4fbecc..9566ad7d004 100644 --- a/Mac/Modules/mlte/mltescan.py +++ b/Mac/Modules/mlte/mltescan.py @@ -20,7 +20,7 @@ def main(): scanner.gentypetest(SHORT+"typetest.py") scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/mlte/mltesupport.py b/Mac/Modules/mlte/mltesupport.py index 8dcbed5bb63..4adde0de9c3 100644 --- a/Mac/Modules/mlte/mltesupport.py +++ b/Mac/Modules/mlte/mltesupport.py @@ -128,7 +128,7 @@ OptRectPtr = OpaqueByValueType("Rect *", "OptRectPtr") UniChar = Type("UniChar", "h") # XXXX For now... # ADD object type here -execfile("mltetypetest.py") +exec(open("mltetypetest.py").read()) # Our (opaque) objects @@ -166,7 +166,7 @@ TXNObject_methods = [] TXNFontMenuObject_methods = [] # ADD _methods initializer here -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups diff --git a/Mac/Modules/osa/osascan.py b/Mac/Modules/osa/osascan.py index fb8196f67f0..8bad4b7bd9d 100644 --- a/Mac/Modules/osa/osascan.py +++ b/Mac/Modules/osa/osascan.py @@ -18,7 +18,7 @@ def main(): scanner.close() scanner.gentypetest(SHORT+"typetest.py") print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/osa/osasupport.py b/Mac/Modules/osa/osasupport.py index 8369932db0b..3afdf4eb9df 100644 --- a/Mac/Modules/osa/osasupport.py +++ b/Mac/Modules/osa/osasupport.py @@ -88,12 +88,12 @@ Function = OSErrWeakLinkFunctionGenerator Method = OSErrWeakLinkMethodGenerator # Test which types we are still missing. -execfile(string.lower(MODPREFIX) + 'typetest.py') +exec(open(string.lower(MODPREFIX) + 'typetest.py').read()) # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/qd/qdscan.py b/Mac/Modules/qd/qdscan.py index 85a8cdc04c1..c601b0e9fd3 100644 --- a/Mac/Modules/qd/qdscan.py +++ b/Mac/Modules/qd/qdscan.py @@ -41,7 +41,7 @@ def main(): ofp.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" import qdsupport print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/qd/qdsupport.py b/Mac/Modules/qd/qdsupport.py index d078ac6cda0..28c2595284d 100644 --- a/Mac/Modules/qd/qdsupport.py +++ b/Mac/Modules/qd/qdsupport.py @@ -269,8 +269,8 @@ functions = [] gr_methods = [] bm_methods = [] #methods = [] -execfile(INPUTFILE) -execfile(EXTRAFILE) +exec(open(INPUTFILE).read()) +exec(open(EXTRAFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/qdoffs/qdoffsscan.py b/Mac/Modules/qdoffs/qdoffsscan.py index d456e004e26..7e8f3160537 100644 --- a/Mac/Modules/qdoffs/qdoffsscan.py +++ b/Mac/Modules/qdoffs/qdoffsscan.py @@ -14,7 +14,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" import qdoffssupport print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/qdoffs/qdoffssupport.py b/Mac/Modules/qdoffs/qdoffssupport.py index 16177733d5d..73855a29e25 100644 --- a/Mac/Modules/qdoffs/qdoffssupport.py +++ b/Mac/Modules/qdoffs/qdoffssupport.py @@ -86,7 +86,7 @@ Method = OSErrWeakLinkMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # A method to convert a GWorldPtr to a GrafPtr f = Method(GrafPtr, 'as_GrafPtr', (GWorldPtr, 'p', InMode)) diff --git a/Mac/Modules/qt/qtscan.py b/Mac/Modules/qt/qtscan.py index a2dba150184..ac561447597 100644 --- a/Mac/Modules/qt/qtscan.py +++ b/Mac/Modules/qt/qtscan.py @@ -35,7 +35,7 @@ def main(): scanner.close() scanner.gentypetest(SHORT+"typetest.py") print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/qt/qtsupport.py b/Mac/Modules/qt/qtsupport.py index 132c2b4f6db..4d7988f1af0 100644 --- a/Mac/Modules/qt/qtsupport.py +++ b/Mac/Modules/qt/qtsupport.py @@ -307,7 +307,7 @@ module.addobject(Movie_object) module.addobject(SGOutput_object) # Test which types we are still missing. -execfile(string.lower(MODPREFIX) + 'typetest.py') +exec(open(string.lower(MODPREFIX) + 'typetest.py').read()) # Create the generator classes used to populate the lists Function = OSErrWeakLinkFunctionGenerator @@ -323,7 +323,7 @@ Media_methods = [] Track_methods = [] Movie_methods = [] SGOutput_methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # # Some functions from ImageCompression.h that we need: diff --git a/Mac/Modules/res/resscan.py b/Mac/Modules/res/resscan.py index 47a97e42855..853fa136fdb 100644 --- a/Mac/Modules/res/resscan.py +++ b/Mac/Modules/res/resscan.py @@ -20,7 +20,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now doing 'import ressupport' ===" import ressupport print "=== Done 'import ressupport'. It's up to you to compile Resmodule.c ===" diff --git a/Mac/Modules/res/ressupport.py b/Mac/Modules/res/ressupport.py index 9e42a454232..4eed9ec7a1d 100644 --- a/Mac/Modules/res/ressupport.py +++ b/Mac/Modules/res/ressupport.py @@ -211,8 +211,8 @@ module.addobject(resobject) functions = [] resmethods = [] -execfile('resgen.py') -execfile('resedit.py') +exec(open('resgen.py').read()) +exec(open('resedit.py').read()) for f in functions: module.add(f) for f in resmethods: resobject.add(f) diff --git a/Mac/Modules/scrap/scrapscan.py b/Mac/Modules/scrap/scrapscan.py index 1fc81912657..7521fba07cf 100644 --- a/Mac/Modules/scrap/scrapscan.py +++ b/Mac/Modules/scrap/scrapscan.py @@ -20,7 +20,7 @@ def main(): scanner.scan() scanner.close() ## print "=== Testing definitions output code ===" -## execfile(defsoutput, {}, {}) +## exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/scrap/scrapsupport.py b/Mac/Modules/scrap/scrapsupport.py index 84a75d22a7b..b4226a56544 100644 --- a/Mac/Modules/scrap/scrapsupport.py +++ b/Mac/Modules/scrap/scrapsupport.py @@ -63,7 +63,7 @@ Method = OSErrMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Mac/Modules/snd/sndscan.py b/Mac/Modules/snd/sndscan.py index c4a82663db5..bcdd0624094 100644 --- a/Mac/Modules/snd/sndscan.py +++ b/Mac/Modules/snd/sndscan.py @@ -17,7 +17,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now doing 'import sndsupport' ===" import sndsupport print "=== Done. It's up to you to compile Sndmodule.c ===" diff --git a/Mac/Modules/snd/sndsupport.py b/Mac/Modules/snd/sndsupport.py index cf0fa6ca5de..5c5da544423 100644 --- a/Mac/Modules/snd/sndsupport.py +++ b/Mac/Modules/snd/sndsupport.py @@ -304,7 +304,7 @@ sndmethods = [] # populate the lists -execfile('sndgen.py') +exec(open('sndgen.py').read()) # add the functions and methods to the module and object, respectively diff --git a/Mac/Modules/te/tescan.py b/Mac/Modules/te/tescan.py index f5b6fff4d42..c0d6e1c3105 100644 --- a/Mac/Modules/te/tescan.py +++ b/Mac/Modules/te/tescan.py @@ -18,7 +18,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" exec "import " + SHORT + "support" print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/te/tesupport.py b/Mac/Modules/te/tesupport.py index ad6c053a465..412d5e72346 100644 --- a/Mac/Modules/te/tesupport.py +++ b/Mac/Modules/te/tesupport.py @@ -198,7 +198,7 @@ Method = TEMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # Converter from/to handle f = Function(TEHandle, 'as_TE', (Handle, 'h', InMode)) diff --git a/Mac/Modules/win/winscan.py b/Mac/Modules/win/winscan.py index f78935d0d51..8d2cea9a8c6 100644 --- a/Mac/Modules/win/winscan.py +++ b/Mac/Modules/win/winscan.py @@ -14,7 +14,7 @@ def main(): scanner.scan() scanner.close() print "=== Testing definitions output code ===" - execfile(defsoutput, {}, {}) + exec(open(defsoutput).read(), {}, {}) print "=== Done scanning and generating, now importing the generated code... ===" import winsupport print "=== Done. It's up to you to compile it now! ===" diff --git a/Mac/Modules/win/winsupport.py b/Mac/Modules/win/winsupport.py index 08a0379c539..2cadbdcfb63 100644 --- a/Mac/Modules/win/winsupport.py +++ b/Mac/Modules/win/winsupport.py @@ -191,7 +191,7 @@ Method = OSErrWeakLinkMethodGenerator # Create and populate the lists functions = [] methods = [] -execfile(INPUTFILE) +exec(open(INPUTFILE).read()) # Add manual routines for converting integer WindowPtr's (as returned by # various event routines) and Dialog objects to a WindowObject. @@ -211,8 +211,8 @@ functions.append(f) # And add the routines that access the internal bits of a window struct. They # are currently #defined in Windows.h, they will be real routines in Copland -# (at which time this execfile can go) -execfile(EDITFILE) +# (at which time this exec can go) +exec(open(EDITFILE).read()) # add the populated lists to the generator groups # (in a different wordl the scan program would generate this) diff --git a/Misc/NEWS b/Misc/NEWS index 09d130200fe..b5a67db22d7 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -152,7 +152,7 @@ Core and Builtins backticks (ie, `x`), <> - Removed these Python builtins: - apply(), callable(), coerce(), file(), reduce(), reload() + apply(), callable(), coerce(), execfile(), file(), reduce(), reload() - Removed these Python methods: {}.has_key diff --git a/Misc/Vim/python.vim b/Misc/Vim/python.vim index 38869312eaa..130b699a75a 100644 --- a/Misc/Vim/python.vim +++ b/Misc/Vim/python.vim @@ -66,10 +66,10 @@ if exists("python_highlight_builtins") syn keyword pythonBuiltin __import__ abs all any basestring bool syn keyword pythonBuiltin buffer callable chr classmethod cmp syn keyword pythonBuiltin complex copyright credits delattr dict - syn keyword pythonBuiltin dir divmod enumerate eval execfile exit file + syn keyword pythonBuiltin dir divmod enumerate eval exec exit syn keyword pythonBuiltin filter float frozenset getattr globals hasattr syn keyword pythonBuiltin hash help hex id int isinstance - syn keyword pythonBuiltin issubclass iter len license list locals long map + syn keyword pythonBuiltin issubclass iter len license list locals map syn keyword pythonBuiltin max min object oct open ord pow property quit syn keyword pythonBuiltin range reload repr reversed round syn keyword pythonBuiltin set setattr slice sorted staticmethod str sum diff --git a/Misc/cheatsheet b/Misc/cheatsheet index 3d344714f6f..c5304426996 100644 --- a/Misc/cheatsheet +++ b/Misc/cheatsheet @@ -282,11 +282,10 @@ None Numeric types -Floats, integers and long integers. +Floats and integers. Floats are implemented with C doubles. - Integers are implemented with C longs. - Long integers have unlimited size (only limit is system resources) + Integers have unlimited size (only limit is system resources) Operators on all numeric types @@ -294,7 +293,6 @@ Operators on all numeric types Operation Result abs(x) the absolute value of x int(x) x converted to integer -long(x) x converted to long integer float(x) x converted to floating point -x x negated +x x unchanged @@ -306,7 +304,7 @@ x % y remainder of x / y divmod(x, y) the tuple (x/y, x%y) x ** y x to the power y (the same as pow(x, y)) -Bit operators on integers and long integers +Bit operators on integers Bit operators Operation >Result @@ -948,9 +946,6 @@ enumerate(seq) Return a iterator giving: (0, seq[0]), (1, seq[1]), ... eval(s[, globals[, Eval string s in (optional) globals, locals contexts.s must locals]]) have no NUL's or newlines. s can also be acode object. Example: x = 1; incr_x = eval('x + 1') -execfile(file[, Executes a file without creating a new module, unlike -globals[, locals]]) import. -file() Synonym for open(). filter(function, Constructs a list from those elements of sequence for which sequence) function returns true. function takes one parameter. float(x) Converts a number or a string to floating point. @@ -977,9 +972,6 @@ len(obj) (sequence, dictionary, or instance of class implementing list(sequence) Converts sequence into a list. If already a list,returns a copy of it. locals() Returns a dictionary containing current local variables. - Converts a number or a string to a long integer. Optional -long(x[, base]) base paramenter specifies base from which to convert string - values. Applies function to every item of list and returns a listof map(function, list, the results. If additional arguments are passed,function ...) must take that many arguments and it is givento function on @@ -1167,7 +1159,7 @@ Operators s^=o = __ixor__(s,o) s|=o = __ior__(s,o) s<<=o = __ilshift__(s,o) s>>=o = __irshift__(s,o) Conversions - int(s) = __int__(s) long(s) = __long__(s) + int(s) = __int__(s) float(s) = __float__(s) complex(s) = __complex__(s) oct(s) = __oct__(s) hex(s) = __hex__(s) Right-hand-side equivalents for all binary operators exist; diff --git a/Misc/python-mode.el b/Misc/python-mode.el index 55ba60246da..5d9af67cf43 100644 --- a/Misc/python-mode.el +++ b/Misc/python-mode.el @@ -380,7 +380,7 @@ support for features needed by `python-mode'.") "bool" "buffer" "callable" "chr" "classmethod" "cmp" "compile" "complex" "copyright" "delattr" "dict" "dir" "divmod" - "enumerate" "eval" "execfile" "exit" "file" + "enumerate" "eval" "exit" "file" "filter" "float" "getattr" "globals" "hasattr" "hash" "hex" "id" "int" "isinstance" "issubclass" "iter" "len" "license" @@ -1262,7 +1262,7 @@ comment." ;; Python subprocess utilities and filters (defun py-execute-file (proc filename) - "Send to Python interpreter process PROC \"execfile('FILENAME')\". + "Send to Python interpreter process PROC \"exec(open('FILENAME').read())\". Make that process's buffer visible and force display. Also make comint believe the user typed this string so that `kill-output-from-shell' does The Right Thing." @@ -1270,7 +1270,7 @@ comint believe the user typed this string so that (procbuf (process-buffer proc)) ; (comint-scroll-to-bottom-on-output t) (msg (format "## working on region in file %s...\n" filename)) - (cmd (format "execfile(r'%s')\n" filename))) + (cmd (format "exec(open(r'%s').read())\n" filename))) (unwind-protect (save-excursion (set-buffer procbuf) @@ -1606,7 +1606,7 @@ specify the region to execute, and optional third argument ASYNC, if non-nil, specifies to run the command asynchronously in its own buffer. -If the Python interpreter shell is running, the region is execfile()'d +If the Python interpreter shell is running, the region is exec()'d in that shell. If you try to execute regions too quickly, `python-mode' will queue them up and execute them one at a time when it sees a `>>> ' prompt from Python. Each time this happens, the @@ -1731,7 +1731,7 @@ subtleties, including the use of the optional ASYNC argument." If the file has already been imported, then do reload instead to get the latest version. -If the file's name does not end in \".py\", then do execfile instead. +If the file's name does not end in \".py\", then do exec instead. If the current buffer is not visiting a file, do `py-execute-buffer' instead. @@ -1768,7 +1768,7 @@ This may be preferable to `\\[py-execute-buffer]' because: (file-name-nondirectory file)))) (format "if globals().has_key('%s'):\n reload(%s)\nelse:\n import %s\n" f f f)) - (format "execfile(r'%s')\n" file)) + (format "exec(open(r'%s'))\n" file)) async)) ;; else (py-execute-buffer async)))) diff --git a/Objects/fileobject.c b/Objects/fileobject.c index 34bca682d0e..81754042127 100644 --- a/Objects/fileobject.c +++ b/Objects/fileobject.c @@ -317,7 +317,7 @@ Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj) ** will cause a pause if we're reading from an ** interactive stream, but that is very unlikely ** unless we're doing something silly like - ** execfile("/dev/tty"). + ** exec(open("/dev/tty").read()). */ c = GETC(stream); if ( c != '\n' ) diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c index 2f4e5131525..b6a7327d615 100644 --- a/Python/bltinmodule.c +++ b/Python/bltinmodule.c @@ -641,107 +641,6 @@ The globals and locals are dictionaries, defaulting to the current\n\ globals and locals. If only globals is given, locals defaults to it."); -static PyObject * -builtin_execfile(PyObject *self, PyObject *args) -{ - char *filename; - PyObject *globals = Py_None, *locals = Py_None; - PyObject *res; - FILE* fp = NULL; - PyCompilerFlags cf; - int exists; - - if (!PyArg_ParseTuple(args, "s|O!O:execfile", - &filename, - &PyDict_Type, &globals, - &locals)) - return NULL; - if (locals != Py_None && !PyMapping_Check(locals)) { - PyErr_SetString(PyExc_TypeError, "locals must be a mapping"); - return NULL; - } - if (globals == Py_None) { - globals = PyEval_GetGlobals(); - if (locals == Py_None) - locals = PyEval_GetLocals(); - } - else if (locals == Py_None) - locals = globals; - if (PyDict_GetItemString(globals, "__builtins__") == NULL) { - if (PyDict_SetItemString(globals, "__builtins__", - PyEval_GetBuiltins()) != 0) - return NULL; - } - - exists = 0; - /* Test for existence or directory. */ -#if defined(PLAN9) - { - Dir *d; - - if ((d = dirstat(filename))!=nil) { - if(d->mode & DMDIR) - werrstr("is a directory"); - else - exists = 1; - free(d); - } - } -#elif defined(RISCOS) - if (object_exists(filename)) { - if (isdir(filename)) - errno = EISDIR; - else - exists = 1; - } -#else /* standard Posix */ - { - struct stat s; - if (stat(filename, &s) == 0) { - if (S_ISDIR(s.st_mode)) -# if defined(PYOS_OS2) && defined(PYCC_VACPP) - errno = EOS2ERR; -# else - errno = EISDIR; -# endif - else - exists = 1; - } - } -#endif - - if (exists) { - Py_BEGIN_ALLOW_THREADS - fp = fopen(filename, "r" PY_STDIOTEXTMODE); - Py_END_ALLOW_THREADS - - if (fp == NULL) { - exists = 0; - } - } - - if (!exists) { - PyErr_SetFromErrnoWithFilename(PyExc_IOError, filename); - return NULL; - } - cf.cf_flags = 0; - if (PyEval_MergeCompilerFlags(&cf)) - res = PyRun_FileExFlags(fp, filename, Py_file_input, globals, - locals, 1, &cf); - else - res = PyRun_FileEx(fp, filename, Py_file_input, globals, - locals, 1); - return res; -} - -PyDoc_STRVAR(execfile_doc, -"execfile(filename[, globals[, locals]])\n\ -\n\ -Read and execute a Python script from a file.\n\ -The globals and locals are dictionaries, defaulting to the current\n\ -globals and locals. If only globals is given, locals defaults to it."); - - static PyObject * builtin_getattr(PyObject *self, PyObject *args) { @@ -1737,7 +1636,6 @@ static PyMethodDef builtin_methods[] = { {"divmod", builtin_divmod, METH_VARARGS, divmod_doc}, {"eval", builtin_eval, METH_VARARGS, eval_doc}, {"exec", builtin_exec, METH_VARARGS, exec_doc}, - {"execfile", builtin_execfile, METH_VARARGS, execfile_doc}, {"filter", builtin_filter, METH_VARARGS, filter_doc}, {"getattr", builtin_getattr, METH_VARARGS, getattr_doc}, {"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc}, diff --git a/README b/README index 4fecd7a68f0..ef9f45222e1 100644 --- a/README +++ b/README @@ -1101,7 +1101,7 @@ Modules/getpath.o. --with(out)-universal-newlines: enable reading of text files with foreign newline convention (default: enabled). In other words, any of \r, \n or \r\n is acceptable as end-of-line character. - If enabled import and execfile will automatically accept any newline + If enabled import will automatically accept any newline in files. Python code can open a file with open(file, 'U') to read it in universal newline mode. THIS OPTION IS UNSUPPORTED. diff --git a/Tools/scripts/hotshotmain.py b/Tools/scripts/hotshotmain.py index 4f406284bd8..7e39d98579e 100644 --- a/Tools/scripts/hotshotmain.py +++ b/Tools/scripts/hotshotmain.py @@ -23,7 +23,12 @@ def run_hotshot(filename, profile, args): prof = hotshot.Profile(profile) sys.path.insert(0, os.path.dirname(filename)) sys.argv = [filename] + args - prof.run("execfile(%r)" % filename) + fp = open(filename) + try: + script = fp.read() + finally: + fp.close() + prof.run("exec(%r)" % script) prof.close() stats = hotshot.stats.load(profile) stats.sort_stats("time", "calls") diff --git a/Tools/versioncheck/README b/Tools/versioncheck/README index a51411b0425..1dd2eca45e4 100644 --- a/Tools/versioncheck/README +++ b/Tools/versioncheck/README @@ -19,7 +19,7 @@ your distribution. In stead of a single URL you can also specify a list of URLs. Each of these will be checked in order until one is available, this is handy for distributions that live in multiple places. Put the primary distribution site (the most up-to-date site) before others. -The script is executed with execfile(), not imported, and the current +The script is read and executed with exec(), not imported, and the current directory is the checkversion directory, so be careful with globals, importing, etc. diff --git a/Tools/versioncheck/checkversions.py b/Tools/versioncheck/checkversions.py index 27c16e7b444..ccb544d4c13 100644 --- a/Tools/versioncheck/checkversions.py +++ b/Tools/versioncheck/checkversions.py @@ -26,7 +26,7 @@ def check1dir(dummy, dir, files): if CHECKNAME in files: fullname = os.path.join(dir, CHECKNAME) try: - execfile(fullname) + exec(open(fullname).read()) except: print('** Exception in', fullname) diff --git a/setup.py b/setup.py index 9c8bd4bfff1..f0191de175f 100644 --- a/setup.py +++ b/setup.py @@ -1369,7 +1369,12 @@ class PyBuildExt(build_ext): return False fficonfig = {} - execfile(ffi_configfile, globals(), fficonfig) + fp = open(ffi_configfile) + try: + script = fp.read() + finally: + fp.close() + exec(script, globals(), fficonfig) ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src') # Add .S (preprocessed assembly) to C compiler source extensions.