summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2007-08-12 00:43:29 +0000
committerNeal Norwitz <nnorwitz@gmail.com>2007-08-12 00:43:29 +0000
commit016880229a369a3fb419f3eed28b6db7c342fe71 (patch)
tree9b11de5c197bc556dd515e035327673765cd4871
parent41eaedd3613cebc83e6b9925499369992c7a7770 (diff)
downloadcpython-git-016880229a369a3fb419f3eed28b6db7c342fe71.tar.gz
Kill execfile(), use exec() instead
-rwxr-xr-xDemo/scripts/newslist.py2
-rwxr-xr-xDemo/scripts/pp.py5
-rw-r--r--Doc/dist/dist.tex2
-rw-r--r--Doc/howto/doanddont.tex6
-rw-r--r--Doc/lib/libdoctest.tex2
-rw-r--r--Doc/lib/libexcs.tex2
-rw-r--r--Doc/lib/libfuncs.tex31
-rw-r--r--Doc/lib/libuser.tex2
-rw-r--r--Doc/ref/ref4.tex7
-rw-r--r--Doc/ref/ref6.tex7
-rw-r--r--Doc/tut/tut.tex14
-rw-r--r--Lib/CGIHTTPServer.py2
-rwxr-xr-xLib/cProfile.py7
-rw-r--r--Lib/distutils/core.py4
-rw-r--r--Lib/doctest.py13
-rw-r--r--Lib/lib-tk/Tkinter.py8
-rw-r--r--Lib/optparse.py2
-rwxr-xr-xLib/pdb.py7
-rw-r--r--Lib/plat-mac/appletrawmain.py2
-rwxr-xr-xLib/plat-mac/bundlebuilder.py7
-rwxr-xr-xLib/profile.py7
-rw-r--r--Lib/test/test_builtin.py55
-rw-r--r--Lib/test/test_multibytecodec.py2
-rw-r--r--Lib/test/test_pkg.py2
-rw-r--r--Lib/test/test_univnewlines.py7
-rw-r--r--Lib/trace.py7
-rw-r--r--Lib/user.py4
-rw-r--r--Mac/Modules/ae/aescan.py2
-rw-r--r--Mac/Modules/ae/aesupport.py4
-rw-r--r--Mac/Modules/ah/ahscan.py2
-rw-r--r--Mac/Modules/ah/ahsupport.py2
-rw-r--r--Mac/Modules/app/appscan.py2
-rw-r--r--Mac/Modules/app/appsupport.py2
-rw-r--r--Mac/Modules/carbonevt/CarbonEvtscan.py2
-rw-r--r--Mac/Modules/carbonevt/CarbonEvtsupport.py2
-rw-r--r--Mac/Modules/cf/cfscan.py2
-rw-r--r--Mac/Modules/cf/cfsupport.py2
-rwxr-xr-xMac/Modules/cg/cgscan.py2
-rwxr-xr-xMac/Modules/cg/cgsupport.py2
-rw-r--r--Mac/Modules/cm/cmscan.py2
-rw-r--r--Mac/Modules/cm/cmsupport.py2
-rw-r--r--Mac/Modules/ctl/ctlscan.py2
-rw-r--r--Mac/Modules/ctl/ctlsupport.py4
-rw-r--r--Mac/Modules/dlg/dlgscan.py2
-rw-r--r--Mac/Modules/dlg/dlgsupport.py2
-rw-r--r--Mac/Modules/drag/dragscan.py2
-rw-r--r--Mac/Modules/drag/dragsupport.py2
-rw-r--r--Mac/Modules/evt/evtscan.py2
-rw-r--r--Mac/Modules/evt/evtsupport.py2
-rw-r--r--Mac/Modules/file/filescan.py2
-rw-r--r--Mac/Modules/file/filesupport.py4
-rw-r--r--Mac/Modules/fm/fmscan.py2
-rw-r--r--Mac/Modules/fm/fmsupport.py2
-rw-r--r--Mac/Modules/folder/folderscan.py2
-rw-r--r--Mac/Modules/folder/foldersupport.py4
-rw-r--r--Mac/Modules/help/helpscan.py2
-rw-r--r--Mac/Modules/help/helpsupport.py2
-rw-r--r--Mac/Modules/ibcarbon/IBCarbonscan.py2
-rw-r--r--Mac/Modules/ibcarbon/IBCarbonsupport.py2
-rw-r--r--Mac/Modules/icn/icnscan.py2
-rw-r--r--Mac/Modules/icn/icnsupport.py2
-rw-r--r--Mac/Modules/launch/launchscan.py2
-rw-r--r--Mac/Modules/launch/launchsupport.py4
-rw-r--r--Mac/Modules/list/listscan.py2
-rw-r--r--Mac/Modules/list/listsupport.py2
-rw-r--r--Mac/Modules/menu/menuscan.py2
-rw-r--r--Mac/Modules/menu/menusupport.py4
-rw-r--r--Mac/Modules/mlte/mltescan.py2
-rw-r--r--Mac/Modules/mlte/mltesupport.py4
-rw-r--r--Mac/Modules/osa/osascan.py2
-rw-r--r--Mac/Modules/osa/osasupport.py4
-rw-r--r--Mac/Modules/qd/qdscan.py2
-rw-r--r--Mac/Modules/qd/qdsupport.py4
-rw-r--r--Mac/Modules/qdoffs/qdoffsscan.py2
-rw-r--r--Mac/Modules/qdoffs/qdoffssupport.py2
-rw-r--r--Mac/Modules/qt/qtscan.py2
-rw-r--r--Mac/Modules/qt/qtsupport.py4
-rw-r--r--Mac/Modules/res/resscan.py2
-rw-r--r--Mac/Modules/res/ressupport.py4
-rw-r--r--Mac/Modules/scrap/scrapscan.py2
-rw-r--r--Mac/Modules/scrap/scrapsupport.py2
-rw-r--r--Mac/Modules/snd/sndscan.py2
-rw-r--r--Mac/Modules/snd/sndsupport.py2
-rw-r--r--Mac/Modules/te/tescan.py2
-rw-r--r--Mac/Modules/te/tesupport.py2
-rw-r--r--Mac/Modules/win/winscan.py2
-rw-r--r--Mac/Modules/win/winsupport.py6
-rw-r--r--Misc/NEWS2
-rw-r--r--Misc/Vim/python.vim4
-rw-r--r--Misc/cheatsheet16
-rw-r--r--Misc/python-mode.el12
-rw-r--r--Objects/fileobject.c2
-rw-r--r--Python/bltinmodule.c102
-rw-r--r--README2
-rw-r--r--Tools/scripts/hotshotmain.py7
-rw-r--r--Tools/versioncheck/README2
-rw-r--r--Tools/versioncheck/checkversions.py2
-rw-r--r--setup.py7
98 files changed, 179 insertions, 341 deletions
diff --git a/Demo/scripts/newslist.py b/Demo/scripts/newslist.py
index 7038380f5c..3d65a08381 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 486986ae34..9010b7af4d 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 ff5106a169..a33227f710 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 0cd5d912b9..b54f0690a3 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 5e28c2acc0..9143b8486b 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 298f04dcfd..74531d3a4d 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 3cc06c8521..0b99c3fd49 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 4e915a22c8..6dd1546f02 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 9ae8bfaea0..6ec60f8c12 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 60e7b02bec..11390056b2 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 74468b1b9f..b39cd473bc 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 a2d809c14c..828b092496 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 d10b7ab9f7..ae16277bcb 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 bd9b8542cd..d60998240f 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 0f408185f0..ec51657419 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 ef588e87bc..144be0a1a8 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 84a6abd192..bae10500d3 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 f408bf3a46..3bbf76b25d 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 6f2eacb20f..5c09e2d124 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 e833addb11..d8186c1d7d 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 55118b5960..cdc247911b 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 a4ae21aa5d..b43082212d 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 32c48fbd93..c2f34e593f 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 1a3f2a96b9..907359b5b7 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 ae4c4421c7..7810caef8c 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 d40f13c232..645517a75f 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 e550e52ad8..99efd2d240 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 1283c1dcd2..0ea367c82f 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 91c5b82efe..d3e1dfd091 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 0b7fe081f8..8768b60b31 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 c5f24beeea..9fa9dde2d7 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 1b04859ef2..246d61ee2b 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 177dfd55f5..73f5f1133a 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 e3c72ae23d..7307327fa8 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 77d12b6299..2adc8cbfc0 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 d2de92e2da..5ff9534bde 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 800581a03e..655331eb2a 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 b2e7946195..82f4919158 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 6eedfbef3f..7fa06e2ac0 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 087f2393df..1a1e46d6f2 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 4109dbabaa..1653bb3ab2 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 25333f1fa0..dd74d238f8 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 d354d94276..04fac8be5b 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 7fb68f7cb1..bf37129b9e 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 fa1442ec37..fcff5c03f8 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 923a56bd4d..e89897a562 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 45838efde6..bb1a9188c6 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 0d0c9ec4df..0adce8b155 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 f58da14a66..8deef92815 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 8ebc69fe4e..b7c5d121e4 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 37aeb508a0..de45ed4042 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 334d5eca15..38abcacf98 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 e69205316c..8e2b8b31fa 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 8c94893011..cccb720adb 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 b9b64bfb01..224b5453ef 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 50e0919dc5..fa8dbde986 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 77f5c2ecc9..37117ee142 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 84e4f1e672..eb7267de15 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 5f4132840e..8744b69bcc 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 bdc3b84413..2d20062bf2 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 1b153854bd..e9a8b78c5c 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 621033ba87..dd43e37552 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 34c2efbcfd..5faf4b3fa0 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 877f6cb48b..14e7dcac28 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 93baede806..2e1144a9b6 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 ae9465ea14..46afe16532 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 a04b7553cb..93d489b5ea 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 adecb4fbec..9566ad7d00 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 8dcbed5bb6..4adde0de9c 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 fb8196f67f..8bad4b7bd9 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 8369932db0..3afdf4eb9d 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 85a8cdc04c..c601b0e9fd 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 d078ac6cda..28c2595284 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 d456e004e2..7e8f316053 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 16177733d5..73855a29e2 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 a2dba15018..ac56144759 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 132c2b4f6d..4d7988f1af 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 47a97e4285..853fa136fd 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 9e42a45423..4eed9ec7a1 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 1fc8191265..7521fba07c 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 84a75d22a7..b4226a5654 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 c4a82663db..bcdd062409 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 cf0fa6ca5d..5c5da54442 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 f5b6fff4d4..c0d6e1c310 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 ad6c053a46..412d5e7234 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 f78935d0d5..8d2cea9a8c 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 08a0379c53..2cadbdcfb6 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 09d130200f..b5a67db22d 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 38869312ea..130b699a75 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 3d344714f6..c530442699 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 55ba60246d..5d9af67cf4 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 34bca682d0..8175404212 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 2f4e513152..b6a7327d61 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -642,107 +642,6 @@ 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)
{
PyObject *v, *result, *dflt = NULL, *release = NULL;
@@ -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 4fecd7a68f..ef9f45222e 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 4f406284bd..7e39d98579 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 a51411b042..1dd2eca45e 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 27c16e7b44..ccb544d4c1 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 9c8bd4bfff..f0191de175 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.