Commit 01688022 authored by Neal Norwitz's avatar Neal Norwitz

Kill execfile(), use exec() instead

parent 41eaedd3
...@@ -99,7 +99,7 @@ for dir in os.curdir, os.environ['HOME']: ...@@ -99,7 +99,7 @@ for dir in os.curdir, os.environ['HOME']:
rcfile = os.path.join(dir, '.newslistrc.py') rcfile = os.path.join(dir, '.newslistrc.py')
if os.path.exists(rcfile): if os.path.exists(rcfile):
print(rcfile) print(rcfile)
execfile(rcfile) exec(open(rcfile).read())
break break
from nntplib import NNTP from nntplib import NNTP
......
...@@ -123,8 +123,9 @@ import tempfile ...@@ -123,8 +123,9 @@ import tempfile
fp = tempfile.NamedTemporaryFile() fp = tempfile.NamedTemporaryFile()
fp.write(program) fp.write(program)
fp.flush() fp.flush()
script = open(tfn).read()
if DFLAG: if DFLAG:
import pdb import pdb
pdb.run('execfile(%r)' % (tfn,)) pdb.run(script)
else: else:
execfile(tfn) exec(script)
...@@ -2290,7 +2290,7 @@ This is useful if you need to find out the distribution meta-data ...@@ -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 (passed as keyword args from \var{script} to \function{setup()}), or
the contents of the config files or command-line. 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 \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, 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 \code{sys.argv[1:]} will be replaced by \var{script_args} for the duration
......
...@@ -81,7 +81,7 @@ There are situations in which \code{from module import *} is just fine: ...@@ -81,7 +81,7 @@ There are situations in which \code{from module import *} is just fine:
\end{itemize} \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, The word ``unadorned'' refers to the use without an explicit dictionary,
in which case those constructs evaluate code in the {\em current} environment. in which case those constructs evaluate code in the {\em current} environment.
...@@ -97,7 +97,7 @@ Bad examples: ...@@ -97,7 +97,7 @@ Bad examples:
>>> def func(s, **kw): >>> def func(s, **kw):
>>> for var, val in kw.items(): >>> for var, val in kw.items():
>>> exec("s.%s=val" % var) # invalid! >>> exec("s.%s=val" % var) # invalid!
>>> execfile("handler.py") >>> exec(open("handler.py").read())
>>> handle() >>> handle()
\end{verbatim} \end{verbatim}
...@@ -111,7 +111,7 @@ Good examples: ...@@ -111,7 +111,7 @@ Good examples:
>>> for var, val in kw.items(): >>> for var, val in kw.items():
>>> setattr(s, var, val) >>> setattr(s, var, val)
>>> d={} >>> d={}
>>> execfile("handle.py", d, d) >>> exec(open("handler.py").read(), d, d)
>>> handle = d['handle'] >>> handle = d['handle']
>>> handle() >>> handle()
\end{verbatim} \end{verbatim}
......
...@@ -1828,7 +1828,7 @@ print doctest.testsource(a, "a.f") ...@@ -1828,7 +1828,7 @@ print doctest.testsource(a, "a.f")
via \function{\refmodule{pdb}.post_mortem()}, passing the traceback object via \function{\refmodule{pdb}.post_mortem()}, passing the traceback object
from the unhandled exception. If \var{pm} is not specified, or is false, 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 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} \versionadded{2.3}
......
...@@ -260,7 +260,7 @@ Raised when an \keyword{assert} statement fails. ...@@ -260,7 +260,7 @@ Raised when an \keyword{assert} statement fails.
% XXXJH xref to these functions? % XXXJH xref to these functions?
Raised when the parser encounters a syntax error. This may occur in Raised when the parser encounters a syntax error. This may occur in
an \keyword{import} statement, in a call to the built-in functions 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 \function{input()}, or when reading the initial script or standard
input (also interactively). input (also interactively).
......
...@@ -382,15 +382,13 @@ class C: ...@@ -382,15 +382,13 @@ class C:
compiled passing \code{'eval'} as the \var{kind} argument. compiled passing \code{'eval'} as the \var{kind} argument.
Hints: dynamic execution of statements is supported by the Hints: dynamic execution of statements is supported by the
\function{exec()} function. Execution of statements from a file is \function{exec()} function. The
supported by the \function{execfile()} function. The
\function{globals()} and \function{locals()} functions returns the \function{globals()} and \function{locals()} functions returns the
current global and local dictionary, respectively, which may be current global and local dictionary, respectively, which may be
useful to pass around for use by \function{eval()} or useful to pass around for use by \function{eval()} or
\function{execfile()}. \function{exec()}.
\end{funcdesc} \end{funcdesc}
\begin{funcdesc}{exec}{object\optional{, globals\optional{, locals}}} \begin{funcdesc}{exec}{object\optional{, globals\optional{, locals}}}
This function supports dynamic execution of Python code. This function supports dynamic execution of Python code.
\var{object} must be either a string, an open file object, or \var{object} must be either a string, an open file object, or
...@@ -425,31 +423,6 @@ class C: ...@@ -425,31 +423,6 @@ class C:
argument to \function{exec()}.} argument to \function{exec()}.}
\end{funcdesc} \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}}} \begin{funcdesc}{file}{filename\optional{, mode\optional{, bufsize}}}
Constructor function for the \class{file} type, described further Constructor function for the \class{file} type, described further
in section~\ref{bltin-file-objects}, ``\ulink{File in section~\ref{bltin-file-objects}, ``\ulink{File
......
...@@ -24,7 +24,7 @@ import user ...@@ -24,7 +24,7 @@ import user
The \module{user} module looks for a file \file{.pythonrc.py} in the user's 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 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 module \module{user}'s) global namespace. Errors during this phase
are not caught; that's up to the program that imports the are not caught; that's up to the program that imports the
\module{user} module, if it wishes. The home directory is assumed to \module{user} module, if it wishes. The home directory is assumed to
......
...@@ -19,8 +19,7 @@ block. A script file (a file given as standard input to the ...@@ -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 interpreter or specified on the interpreter command line the first
argument) is a code block. A script command (a command specified on argument) is a code block. A script command (a command specified on
the interpreter command line with the `\strong{-c}' option) is a code the interpreter command line with the `\strong{-c}' option) is a code
block. The file read by the built-in function \function{execfile()} block. The string argument passed to the built-in functions
is a code block. The string argument passed to the built-in functions
\function{eval()} and \function{exec()} is a code block. \function{eval()} and \function{exec()} is a code block.
The expression read and evaluated by the built-in function The expression read and evaluated by the built-in function
\function{input()} is a code block. \function{input()} is a code block.
...@@ -139,7 +138,7 @@ If the wild card form of import --- \samp{import *} --- is used in a ...@@ -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 function and the function contains or is a nested block with free
variables, the compiler will raise a \exception{SyntaxError}. 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 and \function{input()} functions do not have access to the
full environment for resolving names. Names may be resolved in the full environment for resolving names. Names may be resolved in the
local and global namespaces of the caller. Free variables are not 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 ...@@ -147,7 +146,7 @@ resolved in the nearest enclosing namespace, but in the global
namespace.\footnote{This limitation occurs because the code that is namespace.\footnote{This limitation occurs because the code that is
executed by these operations is not available at the time the executed by these operations is not available at the time the
module is compiled.} module is compiled.}
The \function{exec()}, \function{eval()} and \function{execfile()} The \function{exec()} and \function{eval()}
functions have optional arguments to override functions have optional arguments to override
the global and local namespace. If only one namespace is specified, the global and local namespace. If only one namespace is specified,
it is used for both. it is used for both.
......
...@@ -760,8 +760,8 @@ import __future__ [as name] ...@@ -760,8 +760,8 @@ import __future__ [as name]
That is not a future statement; it's an ordinary import statement with That is not a future statement; it's an ordinary import statement with
no special semantics or syntax restrictions. no special semantics or syntax restrictions.
Code compiled by calls to the builtin functions \function{exec()}, Code compiled by calls to the builtin functions \function{exec()} and
\function{compile()} and \function{execfile()} that occur in a module \function{compile()} that occur in a module
\module{M} containing a future statement will, by default, use the new \module{M} containing a future statement will, by default, use the new
syntax or semantics associated with the future statement. This can, syntax or semantics associated with the future statement. This can,
starting with Python 2.2 be controlled by optional arguments to 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 ...@@ -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, does not affect the code block \emph{containing} the function call,
and code contained in such a string is unaffected by \keyword{global} 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 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{exec}
\bifuncindex{eval} \bifuncindex{eval}
\bifuncindex{execfile}
\bifuncindex{compile} \bifuncindex{compile}
...@@ -409,14 +409,14 @@ this file. ...@@ -409,14 +409,14 @@ this file.
If you want to read an additional start-up file from the current 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 directory, you can program this in the global start-up file using code
like \samp{if os.path.isfile('.pythonrc.py'): 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: script, you must do this explicitly in the script:
\begin{verbatim} \begin{verbatim}
import os import os
filename = os.environ.get('PYTHONSTARTUP') filename = os.environ.get('PYTHONSTARTUP')
if filename and os.path.isfile(filename): if filename and os.path.isfile(filename):
execfile(filename) exec(open(filename).read())
\end{verbatim} \end{verbatim}
...@@ -2736,14 +2736,14 @@ standard module \module{__builtin__}\refbimodindex{__builtin__}: ...@@ -2736,14 +2736,14 @@ standard module \module{__builtin__}\refbimodindex{__builtin__}:
'__name__', 'abs', 'basestring', 'bool', 'buffer', '__name__', 'abs', 'basestring', 'bool', 'buffer',
'chr', 'classmethod', 'cmp', 'compile', 'chr', 'classmethod', 'cmp', 'compile',
'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', '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', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex',
'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', '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', 'object', 'oct', 'open', 'ord', 'pow', 'property', 'quit', 'range',
'repr', 'reversed', 'round', 'set', 'repr', 'reversed', 'round', 'set',
'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super',
'tuple', 'type', 'unichr', 'unicode', 'vars', 'zip'] 'tuple', 'type', 'vars', 'zip']
\end{verbatim} \end{verbatim}
...@@ -4413,8 +4413,8 @@ the debugger, and that's one reason why this loophole is not closed. ...@@ -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 (Buglet: derivation of a class with the same name as the base class
makes use of private variables of the base class possible.) makes use of private variables of the base class possible.)
Notice that code passed to \code{exec()}, \code{eval()} or Notice that code passed to \code{exec()} or \code{eval()}
\code{execfile()} does not consider the classname of the invoking does not consider the classname of the invoking
class to be the current class; this is similar to the effect of the 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{global} statement, the effect of which is likewise restricted to
code that is byte-compiled together. The same restriction applies to code that is byte-compiled together. The same restriction applies to
......
...@@ -316,7 +316,7 @@ class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): ...@@ -316,7 +316,7 @@ class CGIHTTPRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
sys.argv.append(decoded_query) sys.argv.append(decoded_query)
sys.stdout = self.wfile sys.stdout = self.wfile
sys.stdin = self.rfile sys.stdin = self.rfile
execfile(scriptfile, {"__name__": "__main__"}) exec(open(scriptfile).read(), {"__name__": "__main__"})
finally: finally:
sys.argv = save_argv sys.argv = save_argv
sys.stdin = save_stdin sys.stdin = save_stdin
......
...@@ -180,7 +180,12 @@ def main(): ...@@ -180,7 +180,12 @@ def main():
if (len(sys.argv) > 0): if (len(sys.argv) > 0):
sys.path.insert(0, os.path.dirname(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: else:
parser.print_usage() parser.print_usage()
return parser return parser
......
...@@ -179,7 +179,7 @@ def run_setup (script_name, script_args=None, stop_after="run"): ...@@ -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 keyword args from 'script' to 'setup()', or the contents of the
config files or command-line. 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 'sys.argv[0]' will be replaced with 'script' for the duration of the
call. 'script_args' is a list of strings; if supplied, call. 'script_args' is a list of strings; if supplied,
'sys.argv[1:]' will be replaced by 'script_args' for the duration of '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"): ...@@ -217,7 +217,7 @@ def run_setup (script_name, script_args=None, stop_after="run"):
sys.argv[0] = script_name sys.argv[0] = script_name
if script_args is not None: if script_args is not None:
sys.argv[1:] = script_args sys.argv[1:] = script_args
execfile(script_name, g, l) exec(open(script_name).read(), g, l)
finally: finally:
sys.argv = save_argv sys.argv = save_argv
_setup_stop_after = None _setup_stop_after = None
......
...@@ -2490,7 +2490,7 @@ def debug_script(src, pm=False, globs=None): ...@@ -2490,7 +2490,7 @@ def debug_script(src, pm=False, globs=None):
# Note that tempfile.NameTemporaryFile() cannot be used. As the # Note that tempfile.NameTemporaryFile() cannot be used. As the
# docs say, a file so created cannot be opened by name a second time # 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") srcfilename = tempfile.mktemp(".py", "doctestdebug")
f = open(srcfilename, 'w') f = open(srcfilename, 'w')
f.write(src) f.write(src)
...@@ -2504,14 +2504,17 @@ def debug_script(src, pm=False, globs=None): ...@@ -2504,14 +2504,17 @@ def debug_script(src, pm=False, globs=None):
if pm: if pm:
try: try:
execfile(srcfilename, globs, globs) exec(open(srcfilename).read(), globs, globs)
except: except:
print(sys.exc_info()[1]) print(sys.exc_info()[1])
pdb.post_mortem(sys.exc_info()[2]) pdb.post_mortem(sys.exc_info()[2])
else: else:
# Note that %r is vital here. '%s' instead can, e.g., cause fp = open(srcfilename)
# backslashes to get treated as metacharacters on Windows. try:
pdb.run("execfile(%r)" % srcfilename, globs, globs) script = fp.read()
finally:
fp.close()
pdb.run("exec(%r)" % script, globs, globs)
finally: finally:
os.remove(srcfilename) os.remove(srcfilename)
......
...@@ -1688,8 +1688,8 @@ class Tk(Misc, Wm): ...@@ -1688,8 +1688,8 @@ class Tk(Misc, Wm):
_default_root = None _default_root = None
def readprofile(self, baseName, className): def readprofile(self, baseName, className):
"""Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into """Internal function. It reads BASENAME.tcl and CLASSNAME.tcl into
the Tcl Interpreter and calls execfile on BASENAME.py and CLASSNAME.py if the Tcl Interpreter and calls exec on the contents of BASENAME.py and
such a file exists in the home directory.""" CLASSNAME.py if such a file exists in the home directory."""
import os import os
if 'HOME' in os.environ: home = os.environ['HOME'] if 'HOME' in os.environ: home = os.environ['HOME']
else: home = os.curdir else: home = os.curdir
...@@ -1702,11 +1702,11 @@ class Tk(Misc, Wm): ...@@ -1702,11 +1702,11 @@ class Tk(Misc, Wm):
if os.path.isfile(class_tcl): if os.path.isfile(class_tcl):
self.tk.call('source', class_tcl) self.tk.call('source', class_tcl)
if os.path.isfile(class_py): if os.path.isfile(class_py):
execfile(class_py, dir) exec(open(class_py).read(), dir)
if os.path.isfile(base_tcl): if os.path.isfile(base_tcl):
self.tk.call('source', base_tcl) self.tk.call('source', base_tcl)
if os.path.isfile(base_py): if os.path.isfile(base_py):
execfile(base_py, dir) exec(open(base_py).read(), dir)
def report_callback_exception(self, exc, val, tb): def report_callback_exception(self, exc, val, tb):
"""Internal function. It reports exception on sys.stderr.""" """Internal function. It reports exception on sys.stderr."""
import traceback, sys import traceback, sys
......
...@@ -874,7 +874,7 @@ class Values: ...@@ -874,7 +874,7 @@ class Values:
def read_file(self, filename, mode="careful"): def read_file(self, filename, mode="careful"):
vars = {} vars = {}
execfile(filename, vars) exec(open(filename).read(), vars)
self._update(vars, mode) self._update(vars, mode)
def ensure_value(self, attr, value): def ensure_value(self, attr, value):
......
...@@ -1164,7 +1164,12 @@ see no sign that the breakpoint was reached. ...@@ -1164,7 +1164,12 @@ see no sign that the breakpoint was reached.
self._wait_for_mainpyfile = 1 self._wait_for_mainpyfile = 1
self.mainpyfile = self.canonic(filename) self.mainpyfile = self.canonic(filename)
self._user_requested_quit = 0 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) self.run(statement)
# Simplified interface # Simplified interface
......
...@@ -41,7 +41,7 @@ if os.path.exists(__file__): ...@@ -41,7 +41,7 @@ if os.path.exists(__file__):
# #
sys.argv[0] = __file__ sys.argv[0] = __file__
del argvemulator, os, sys, _dir del argvemulator, os, sys, _dir
execfile(__file__) exec(open(__file__).read())
else: else:
__file__ = os.path.join(_dir, '__main__.pyc') __file__ = os.path.join(_dir, '__main__.pyc')
if os.path.exists(__file__): if os.path.exists(__file__):
......
...@@ -322,7 +322,12 @@ ARGV_EMULATOR = """\ ...@@ -322,7 +322,12 @@ ARGV_EMULATOR = """\
import argvemulator, os import argvemulator, os
argvemulator.ArgvCollector().mainloop() 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)
""" """
# #
......
...@@ -609,7 +609,12 @@ def main(): ...@@ -609,7 +609,12 @@ def main():
if (len(sys.argv) > 0): if (len(sys.argv) > 0):
sys.path.insert(0, os.path.dirname(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: else:
parser.print_usage() parser.print_usage()
return parser return parser
......
...@@ -11,10 +11,6 @@ warnings.filterwarnings("ignore", "hex../oct.. of negative int", ...@@ -11,10 +11,6 @@ warnings.filterwarnings("ignore", "hex../oct.. of negative int",
warnings.filterwarnings("ignore", "integer argument expected", warnings.filterwarnings("ignore", "integer argument expected",
DeprecationWarning, "unittest") DeprecationWarning, "unittest")
# count the number of test runs.
# used to skip running test_execfile() multiple times
numruns = 0
class Squares: class Squares:
def __init__(self, max): def __init__(self, max):
...@@ -399,57 +395,6 @@ class BuiltinTest(unittest.TestCase): ...@@ -399,57 +395,6 @@ class BuiltinTest(unittest.TestCase):
return 1 # used to be 'a' but that's no longer an error return 1 # used to be 'a' but that's no longer an error
self.assertRaises(TypeError, eval, 'dir()', globals(), C()) 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): def test_exec(self):
g = {} g = {}
exec('z = 1', g) exec('z = 1', g)
......
...@@ -49,7 +49,7 @@ class Test_MultibyteCodec(unittest.TestCase): ...@@ -49,7 +49,7 @@ class Test_MultibyteCodec(unittest.TestCase):
try: try:
for enc in ALL_CJKENCODINGS: for enc in ALL_CJKENCODINGS:
print('# coding:', enc, file=io.open(TESTFN, 'w')) print('# coding:', enc, file=io.open(TESTFN, 'w'))
execfile(TESTFN) exec(open(TESTFN).read())
finally: finally:
test_support.unlink(TESTFN) test_support.unlink(TESTFN)
......
...@@ -63,7 +63,7 @@ def runtest(hier, code): ...@@ -63,7 +63,7 @@ def runtest(hier, code):
sys.path.insert(0, root) sys.path.insert(0, root)
if verbose: print("sys.path =", sys.path) if verbose: print("sys.path =", sys.path)
try: try:
execfile(fname, globals(), {}) exec(open(fname).read(), globals(), {})
except: except:
traceback.print_exc(file=sys.stdout) traceback.print_exc(file=sys.stdout)
finally: finally:
......
...@@ -78,13 +78,6 @@ class TestGenericUnivNewlines(unittest.TestCase): ...@@ -78,13 +78,6 @@ class TestGenericUnivNewlines(unittest.TestCase):
data = fp.readlines() data = fp.readlines()
self.assertEqual(data, DATA_SPLIT[1:]) 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): class TestNativeNewlines(TestGenericUnivNewlines):
NEWLINE = None NEWLINE = None
......
...@@ -773,7 +773,12 @@ def main(argv=None): ...@@ -773,7 +773,12 @@ def main(argv=None):
ignoredirs=ignore_dirs, infile=counts_file, ignoredirs=ignore_dirs, infile=counts_file,
outfile=counts_file) outfile=counts_file)
try: 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: except IOError as err:
_err_exit("Cannot run file %r because: %s" % (sys.argv[0], err)) _err_exit("Cannot run file %r because: %s" % (sys.argv[0], err))
except SystemExit: except SystemExit:
......
...@@ -12,7 +12,7 @@ that wishes to use the mechanism must execute the statement ...@@ -12,7 +12,7 @@ that wishes to use the mechanism must execute the statement
import user import user
The user module looks for a file .pythonrc.py in the user's home 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 namespace. Errors during this phase are not caught; that's up to the
program that imports the user module, if it wishes. program that imports the user module, if it wishes.
...@@ -42,4 +42,4 @@ except IOError: ...@@ -42,4 +42,4 @@ except IOError:
pass pass
else: else:
f.close() f.close()
execfile(pythonrc) exec(open(pythonrc).read())
...@@ -21,7 +21,7 @@ def main(): ...@@ -21,7 +21,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done Scanning and Generating, now doing 'import aesupport' ===" print "=== Done Scanning and Generating, now doing 'import aesupport' ==="
import aesupport import aesupport
print "=== Done 'import aesupport'. It's up to you to compile AEmodule.c ===" print "=== Done 'import aesupport'. It's up to you to compile AEmodule.c ==="
......
...@@ -213,8 +213,8 @@ module.addobject(aedescobject) ...@@ -213,8 +213,8 @@ module.addobject(aedescobject)
functions = [] functions = []
aedescmethods = [] aedescmethods = []
execfile('aegen.py') exec(open('aegen.py').read())
##execfile('aedatamodelgen.py') ##exec(open('aedatamodelgen.py').read())
# Manual generator # Manual generator
AutoDispose_body = """ AutoDispose_body = """
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -34,7 +34,7 @@ Function = OSErrFunctionGenerator ...@@ -34,7 +34,7 @@ Function = OSErrFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -121,7 +121,7 @@ Function = OSErrWeakLinkFunctionGenerator ...@@ -121,7 +121,7 @@ Function = OSErrWeakLinkFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -20,7 +20,7 @@ def main(): ...@@ -20,7 +20,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "--done scanning, importing--" print "--done scanning, importing--"
import CarbonEvtsupport import CarbonEvtsupport
print "done" print "done"
......
...@@ -214,7 +214,7 @@ for typ in RefObjectTypes: ## go thru all ObjectTypes as defined in CarbonEvents ...@@ -214,7 +214,7 @@ for typ in RefObjectTypes: ## go thru all ObjectTypes as defined in CarbonEvents
execstr = typ + 'methods = []' execstr = typ + 'methods = []'
exec execstr exec execstr
execfile('CarbonEventsgen.py') exec(open('CarbonEventsgen.py').read())
......
...@@ -45,7 +45,7 @@ def main(): ...@@ -45,7 +45,7 @@ def main():
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -529,7 +529,7 @@ CFMutableStringRef_methods = [] ...@@ -529,7 +529,7 @@ CFMutableStringRef_methods = []
CFURLRef_methods = [] CFURLRef_methods = []
# ADD _methods initializer here # ADD _methods initializer here
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
......
...@@ -23,7 +23,7 @@ def main(): ...@@ -23,7 +23,7 @@ def main():
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -145,7 +145,7 @@ Method = MethodGenerator ...@@ -145,7 +145,7 @@ Method = MethodGenerator
CGContextRef_methods = [] CGContextRef_methods = []
# ADD _methods initializer here # ADD _methods initializer here
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# manual method, lives in Quickdraw.h # manual method, lives in Quickdraw.h
f = Method(void, 'SyncCGContextOriginWithPort', f = Method(void, 'SyncCGContextOriginWithPort',
......
...@@ -17,7 +17,7 @@ def main(): ...@@ -17,7 +17,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -112,7 +112,7 @@ Method = OSErrWeakLinkMethodGenerator ...@@ -112,7 +112,7 @@ Method = OSErrWeakLinkMethodGenerator
functions = [] functions = []
c_methods = [] c_methods = []
ci_methods = [] ci_methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -15,7 +15,7 @@ def main(): ...@@ -15,7 +15,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now doing 'import ctlsupport' ===" print "=== Done scanning and generating, now doing 'import ctlsupport' ==="
import ctlsupport import ctlsupport
print "=== Done. It's up to you to compile Ctlmodule.c ===" print "=== Done. It's up to you to compile Ctlmodule.c ==="
......
...@@ -507,8 +507,8 @@ Method = OSErrWeakLinkMethodGenerator ...@@ -507,8 +507,8 @@ Method = OSErrWeakLinkMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
execfile('ctledit.py') exec(open('ctledit.py').read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
for f in functions: module.add(f) for f in functions: module.add(f)
......
...@@ -19,7 +19,7 @@ def main(): ...@@ -19,7 +19,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -240,7 +240,7 @@ Method = OSErrWeakLinkMethodGenerator ...@@ -240,7 +240,7 @@ Method = OSErrWeakLinkMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile("dlggen.py") exec(open("dlggen.py").read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
for f in functions: module.add(f) for f in functions: module.add(f)
......
...@@ -26,7 +26,7 @@ def main(): ...@@ -26,7 +26,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now doing 'import dragsupport' ===" print "=== Done scanning and generating, now doing 'import dragsupport' ==="
import dragsupport import dragsupport
print "=== Done. It's up to you to compile Dragmodule.c ===" print "=== Done. It's up to you to compile Dragmodule.c ==="
......
...@@ -216,7 +216,7 @@ Method = OSErrWeakLinkMethodGenerator ...@@ -216,7 +216,7 @@ Method = OSErrWeakLinkMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
for f in functions: module.add(f) for f in functions: module.add(f)
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -50,7 +50,7 @@ Function = OSErrWeakLinkFunctionGenerator ...@@ -50,7 +50,7 @@ Function = OSErrWeakLinkFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# Move TickCount here, for convenience # Move TickCount here, for convenience
f = Function(UInt32, 'TickCount', f = Function(UInt32, 'TickCount',
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.close() scanner.close()
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -340,7 +340,7 @@ PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSSpec, PyMac_GetFSSpec); ...@@ -340,7 +340,7 @@ PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSSpec, PyMac_GetFSSpec);
PyMac_INIT_TOOLBOX_OBJECT_CONVERT(FSRef, PyMac_GetFSRef); 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: # Our object types:
class FSCatalogInfoDefinition(PEP253Mixin, ObjectDefinition): class FSCatalogInfoDefinition(PEP253Mixin, ObjectDefinition):
...@@ -806,7 +806,7 @@ functions = [] ...@@ -806,7 +806,7 @@ functions = []
alias_methods = [] alias_methods = []
fsref_methods = [] fsref_methods = []
fsspec_methods = [] fsspec_methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# Manual generators: # Manual generators:
FSRefMakePath_body = """ FSRefMakePath_body = """
......
...@@ -17,7 +17,7 @@ def main(): ...@@ -17,7 +17,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -70,7 +70,7 @@ Function = OSErrWeakLinkFunctionGenerator ...@@ -70,7 +70,7 @@ Function = OSErrWeakLinkFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -19,7 +19,7 @@ def main(): ...@@ -19,7 +19,7 @@ def main():
scanner.close() scanner.close()
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -33,7 +33,7 @@ includestuff = includestuff + """ ...@@ -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... # From here on it's basically all boiler plate...
...@@ -45,7 +45,7 @@ Function = OSErrFunctionGenerator ...@@ -45,7 +45,7 @@ Function = OSErrFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -66,7 +66,7 @@ Function = OSErrFunctionGenerator ...@@ -66,7 +66,7 @@ Function = OSErrFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
##methods = [] ##methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "--done scanning, importing--" print "--done scanning, importing--"
import IBCarbonsupport import IBCarbonsupport
print "done" print "done"
......
...@@ -42,7 +42,7 @@ module.addobject(ibnibobject) ...@@ -42,7 +42,7 @@ module.addobject(ibnibobject)
functions = [] functions = []
methods = [] methods = []
execfile('IBCarbongen.py') exec(open('IBCarbongen.py').read())
for f in functions: module.add(f) for f in functions: module.add(f)
for m in methods: ibnibobject.add(m) for m in methods: ibnibobject.add(m)
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -78,7 +78,7 @@ Function = OSErrWeakLinkFunctionGenerator ...@@ -78,7 +78,7 @@ Function = OSErrWeakLinkFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
##methods = [] ##methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -19,7 +19,7 @@ def main(): ...@@ -19,7 +19,7 @@ def main():
scanner.close() scanner.close()
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -75,7 +75,7 @@ LSItemInfoRecord_New(LSItemInfoRecord *it) ...@@ -75,7 +75,7 @@ LSItemInfoRecord_New(LSItemInfoRecord *it)
""" """
# From here on it's basically all boiler plate... # 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 # Create the generator groups and link them
module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff) module = MacModule(MODNAME, MODPREFIX, includestuff, finalstuff, initstuff)
...@@ -89,7 +89,7 @@ Function = OSErrFunctionGenerator ...@@ -89,7 +89,7 @@ Function = OSErrFunctionGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
##methods = [] ##methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -169,7 +169,7 @@ Method = ListMethodGenerator ...@@ -169,7 +169,7 @@ Method = ListMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# Function to convert any handle to a list and vv. # Function to convert any handle to a list and vv.
##f = Function(ListHandle, 'as_List', (Handle, 'h', InMode)) ##f = Function(ListHandle, 'as_List', (Handle, 'h', InMode))
......
...@@ -14,7 +14,7 @@ def main(): ...@@ -14,7 +14,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now doing 'import menusupport' ===" print "=== Done scanning and generating, now doing 'import menusupport' ==="
import menusupport import menusupport
print "=== Done. It's up to you to compile Menumodule.c ===" print "=== Done. It's up to you to compile Menumodule.c ==="
......
...@@ -96,8 +96,8 @@ Method = OSErrWeakLinkMethodGenerator ...@@ -96,8 +96,8 @@ Method = OSErrWeakLinkMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
execfile(EXTRAFILE) exec(open(EXTRAFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
for f in functions: module.add(f) for f in functions: module.add(f)
......
...@@ -20,7 +20,7 @@ def main(): ...@@ -20,7 +20,7 @@ def main():
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -128,7 +128,7 @@ OptRectPtr = OpaqueByValueType("Rect *", "OptRectPtr") ...@@ -128,7 +128,7 @@ OptRectPtr = OpaqueByValueType("Rect *", "OptRectPtr")
UniChar = Type("UniChar", "h") # XXXX For now... UniChar = Type("UniChar", "h") # XXXX For now...
# ADD object type here # ADD object type here
execfile("mltetypetest.py") exec(open("mltetypetest.py").read())
# Our (opaque) objects # Our (opaque) objects
...@@ -166,7 +166,7 @@ TXNObject_methods = [] ...@@ -166,7 +166,7 @@ TXNObject_methods = []
TXNFontMenuObject_methods = [] TXNFontMenuObject_methods = []
# ADD _methods initializer here # ADD _methods initializer here
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.close() scanner.close()
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -88,12 +88,12 @@ Function = OSErrWeakLinkFunctionGenerator ...@@ -88,12 +88,12 @@ Function = OSErrWeakLinkFunctionGenerator
Method = OSErrWeakLinkMethodGenerator Method = OSErrWeakLinkMethodGenerator
# Test which types we are still missing. # 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 # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -41,7 +41,7 @@ def main(): ...@@ -41,7 +41,7 @@ def main():
ofp.close() ofp.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
import qdsupport import qdsupport
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -269,8 +269,8 @@ functions = [] ...@@ -269,8 +269,8 @@ functions = []
gr_methods = [] gr_methods = []
bm_methods = [] bm_methods = []
#methods = [] #methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
execfile(EXTRAFILE) exec(open(EXTRAFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -14,7 +14,7 @@ def main(): ...@@ -14,7 +14,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
import qdoffssupport import qdoffssupport
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -86,7 +86,7 @@ Method = OSErrWeakLinkMethodGenerator ...@@ -86,7 +86,7 @@ Method = OSErrWeakLinkMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# A method to convert a GWorldPtr to a GrafPtr # A method to convert a GWorldPtr to a GrafPtr
f = Method(GrafPtr, 'as_GrafPtr', (GWorldPtr, 'p', InMode)) f = Method(GrafPtr, 'as_GrafPtr', (GWorldPtr, 'p', InMode))
......
...@@ -35,7 +35,7 @@ def main(): ...@@ -35,7 +35,7 @@ def main():
scanner.close() scanner.close()
scanner.gentypetest(SHORT+"typetest.py") scanner.gentypetest(SHORT+"typetest.py")
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -307,7 +307,7 @@ module.addobject(Movie_object) ...@@ -307,7 +307,7 @@ module.addobject(Movie_object)
module.addobject(SGOutput_object) module.addobject(SGOutput_object)
# Test which types we are still missing. # 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 # Create the generator classes used to populate the lists
Function = OSErrWeakLinkFunctionGenerator Function = OSErrWeakLinkFunctionGenerator
...@@ -323,7 +323,7 @@ Media_methods = [] ...@@ -323,7 +323,7 @@ Media_methods = []
Track_methods = [] Track_methods = []
Movie_methods = [] Movie_methods = []
SGOutput_methods = [] SGOutput_methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# #
# Some functions from ImageCompression.h that we need: # Some functions from ImageCompression.h that we need:
......
...@@ -20,7 +20,7 @@ def main(): ...@@ -20,7 +20,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now doing 'import ressupport' ===" print "=== Done scanning and generating, now doing 'import ressupport' ==="
import ressupport import ressupport
print "=== Done 'import ressupport'. It's up to you to compile Resmodule.c ===" print "=== Done 'import ressupport'. It's up to you to compile Resmodule.c ==="
......
...@@ -211,8 +211,8 @@ module.addobject(resobject) ...@@ -211,8 +211,8 @@ module.addobject(resobject)
functions = [] functions = []
resmethods = [] resmethods = []
execfile('resgen.py') exec(open('resgen.py').read())
execfile('resedit.py') exec(open('resedit.py').read())
for f in functions: module.add(f) for f in functions: module.add(f)
for f in resmethods: resobject.add(f) for f in resmethods: resobject.add(f)
......
...@@ -20,7 +20,7 @@ def main(): ...@@ -20,7 +20,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
## print "=== Testing definitions output code ===" ## print "=== Testing definitions output code ==="
## execfile(defsoutput, {}, {}) ## exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -63,7 +63,7 @@ Method = OSErrMethodGenerator ...@@ -63,7 +63,7 @@ Method = OSErrMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -17,7 +17,7 @@ def main(): ...@@ -17,7 +17,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now doing 'import sndsupport' ===" print "=== Done scanning and generating, now doing 'import sndsupport' ==="
import sndsupport import sndsupport
print "=== Done. It's up to you to compile Sndmodule.c ===" print "=== Done. It's up to you to compile Sndmodule.c ==="
......
...@@ -304,7 +304,7 @@ sndmethods = [] ...@@ -304,7 +304,7 @@ sndmethods = []
# populate the lists # populate the lists
execfile('sndgen.py') exec(open('sndgen.py').read())
# add the functions and methods to the module and object, respectively # add the functions and methods to the module and object, respectively
......
...@@ -18,7 +18,7 @@ def main(): ...@@ -18,7 +18,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
exec "import " + SHORT + "support" exec "import " + SHORT + "support"
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -198,7 +198,7 @@ Method = TEMethodGenerator ...@@ -198,7 +198,7 @@ Method = TEMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# Converter from/to handle # Converter from/to handle
f = Function(TEHandle, 'as_TE', (Handle, 'h', InMode)) f = Function(TEHandle, 'as_TE', (Handle, 'h', InMode))
......
...@@ -14,7 +14,7 @@ def main(): ...@@ -14,7 +14,7 @@ def main():
scanner.scan() scanner.scan()
scanner.close() scanner.close()
print "=== Testing definitions output code ===" print "=== Testing definitions output code ==="
execfile(defsoutput, {}, {}) exec(open(defsoutput).read(), {}, {})
print "=== Done scanning and generating, now importing the generated code... ===" print "=== Done scanning and generating, now importing the generated code... ==="
import winsupport import winsupport
print "=== Done. It's up to you to compile it now! ===" print "=== Done. It's up to you to compile it now! ==="
......
...@@ -191,7 +191,7 @@ Method = OSErrWeakLinkMethodGenerator ...@@ -191,7 +191,7 @@ Method = OSErrWeakLinkMethodGenerator
# Create and populate the lists # Create and populate the lists
functions = [] functions = []
methods = [] methods = []
execfile(INPUTFILE) exec(open(INPUTFILE).read())
# Add manual routines for converting integer WindowPtr's (as returned by # Add manual routines for converting integer WindowPtr's (as returned by
# various event routines) and Dialog objects to a WindowObject. # various event routines) and Dialog objects to a WindowObject.
...@@ -211,8 +211,8 @@ functions.append(f) ...@@ -211,8 +211,8 @@ functions.append(f)
# And add the routines that access the internal bits of a window struct. They # 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 # are currently #defined in Windows.h, they will be real routines in Copland
# (at which time this execfile can go) # (at which time this exec can go)
execfile(EDITFILE) exec(open(EDITFILE).read())
# add the populated lists to the generator groups # add the populated lists to the generator groups
# (in a different wordl the scan program would generate this) # (in a different wordl the scan program would generate this)
......
...@@ -152,7 +152,7 @@ Core and Builtins ...@@ -152,7 +152,7 @@ Core and Builtins
backticks (ie, `x`), <> backticks (ie, `x`), <>
- Removed these Python builtins: - Removed these Python builtins:
apply(), callable(), coerce(), file(), reduce(), reload() apply(), callable(), coerce(), execfile(), file(), reduce(), reload()
- Removed these Python methods: - Removed these Python methods:
{}.has_key {}.has_key
......
...@@ -66,10 +66,10 @@ if exists("python_highlight_builtins") ...@@ -66,10 +66,10 @@ if exists("python_highlight_builtins")
syn keyword pythonBuiltin __import__ abs all any basestring bool syn keyword pythonBuiltin __import__ abs all any basestring bool
syn keyword pythonBuiltin buffer callable chr classmethod cmp syn keyword pythonBuiltin buffer callable chr classmethod cmp
syn keyword pythonBuiltin complex copyright credits delattr dict 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 filter float frozenset getattr globals hasattr
syn keyword pythonBuiltin hash help hex id int isinstance 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 max min object oct open ord pow property quit
syn keyword pythonBuiltin range reload repr reversed round syn keyword pythonBuiltin range reload repr reversed round
syn keyword pythonBuiltin set setattr slice sorted staticmethod str sum syn keyword pythonBuiltin set setattr slice sorted staticmethod str sum
......
...@@ -282,11 +282,10 @@ None ...@@ -282,11 +282,10 @@ None
Numeric types Numeric types
Floats, integers and long integers. Floats and integers.
Floats are implemented with C doubles. Floats are implemented with C doubles.
Integers are implemented with C longs. Integers have unlimited size (only limit is system resources)
Long integers have unlimited size (only limit is system resources)
Operators on all numeric types Operators on all numeric types
...@@ -294,7 +293,6 @@ Operators on all numeric types ...@@ -294,7 +293,6 @@ Operators on all numeric types
Operation Result Operation Result
abs(x) the absolute value of x abs(x) the absolute value of x
int(x) x converted to integer int(x) x converted to integer
long(x) x converted to long integer
float(x) x converted to floating point float(x) x converted to floating point
-x x negated -x x negated
+x x unchanged +x x unchanged
...@@ -306,7 +304,7 @@ x % y remainder of x / y ...@@ -306,7 +304,7 @@ x % y remainder of x / y
divmod(x, y) the tuple (x/y, x%y) divmod(x, y) the tuple (x/y, x%y)
x ** y x to the power y (the same as pow(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 Bit operators
Operation >Result Operation >Result
...@@ -948,9 +946,6 @@ enumerate(seq) Return a iterator giving: (0, seq[0]), (1, seq[1]), ... ...@@ -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 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. locals]]) have no NUL's or newlines. s can also be acode object.
Example: x = 1; incr_x = eval('x + 1') 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 filter(function, Constructs a list from those elements of sequence for which
sequence) function returns true. function takes one parameter. sequence) function returns true. function takes one parameter.
float(x) Converts a number or a string to floating point. float(x) Converts a number or a string to floating point.
...@@ -977,9 +972,6 @@ len(obj) (sequence, dictionary, or instance of class implementing ...@@ -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 list(sequence) Converts sequence into a list. If already a list,returns a
copy of it. copy of it.
locals() Returns a dictionary containing current local variables. 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 Applies function to every item of list and returns a listof
map(function, list, the results. If additional arguments are passed,function map(function, list, the results. If additional arguments are passed,function
...) must take that many arguments and it is givento function on ...) must take that many arguments and it is givento function on
...@@ -1167,7 +1159,7 @@ Operators ...@@ -1167,7 +1159,7 @@ Operators
s^=o = __ixor__(s,o) s|=o = __ior__(s,o) s^=o = __ixor__(s,o) s|=o = __ior__(s,o)
s<<=o = __ilshift__(s,o) s>>=o = __irshift__(s,o) s<<=o = __ilshift__(s,o) s>>=o = __irshift__(s,o)
Conversions Conversions
int(s) = __int__(s) long(s) = __long__(s) int(s) = __int__(s)
float(s) = __float__(s) complex(s) = __complex__(s) float(s) = __float__(s) complex(s) = __complex__(s)
oct(s) = __oct__(s) hex(s) = __hex__(s) oct(s) = __oct__(s) hex(s) = __hex__(s)
Right-hand-side equivalents for all binary operators exist; Right-hand-side equivalents for all binary operators exist;
......
...@@ -380,7 +380,7 @@ support for features needed by `python-mode'.") ...@@ -380,7 +380,7 @@ support for features needed by `python-mode'.")
"bool" "buffer" "callable" "chr" "classmethod" "bool" "buffer" "callable" "chr" "classmethod"
"cmp" "compile" "complex" "copyright" "cmp" "compile" "complex" "copyright"
"delattr" "dict" "dir" "divmod" "delattr" "dict" "dir" "divmod"
"enumerate" "eval" "execfile" "exit" "file" "enumerate" "eval" "exit" "file"
"filter" "float" "getattr" "globals" "hasattr" "filter" "float" "getattr" "globals" "hasattr"
"hash" "hex" "id" "int" "hash" "hex" "id" "int"
"isinstance" "issubclass" "iter" "len" "license" "isinstance" "issubclass" "iter" "len" "license"
...@@ -1262,7 +1262,7 @@ comment." ...@@ -1262,7 +1262,7 @@ comment."
;; Python subprocess utilities and filters ;; Python subprocess utilities and filters
(defun py-execute-file (proc filename) (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 Make that process's buffer visible and force display. Also make
comint believe the user typed this string so that comint believe the user typed this string so that
`kill-output-from-shell' does The Right Thing." `kill-output-from-shell' does The Right Thing."
...@@ -1270,7 +1270,7 @@ comint believe the user typed this string so that ...@@ -1270,7 +1270,7 @@ comint believe the user typed this string so that
(procbuf (process-buffer proc)) (procbuf (process-buffer proc))
; (comint-scroll-to-bottom-on-output t) ; (comint-scroll-to-bottom-on-output t)
(msg (format "## working on region in file %s...\n" filename)) (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 (unwind-protect
(save-excursion (save-excursion
(set-buffer procbuf) (set-buffer procbuf)
...@@ -1606,7 +1606,7 @@ specify the region to execute, and optional third argument ASYNC, if ...@@ -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 non-nil, specifies to run the command asynchronously in its own
buffer. 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, 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 `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 it sees a `>>> ' prompt from Python. Each time this happens, the
...@@ -1731,7 +1731,7 @@ subtleties, including the use of the optional ASYNC argument." ...@@ -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 If the file has already been imported, then do reload instead to get
the latest version. 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' If the current buffer is not visiting a file, do `py-execute-buffer'
instead. instead.
...@@ -1768,7 +1768,7 @@ This may be preferable to `\\[py-execute-buffer]' because: ...@@ -1768,7 +1768,7 @@ This may be preferable to `\\[py-execute-buffer]' because:
(file-name-nondirectory file)))) (file-name-nondirectory file))))
(format "if globals().has_key('%s'):\n reload(%s)\nelse:\n import %s\n" (format "if globals().has_key('%s'):\n reload(%s)\nelse:\n import %s\n"
f f f)) f f f))
(format "execfile(r'%s')\n" file)) (format "exec(open(r'%s'))\n" file))
async)) async))
;; else ;; else
(py-execute-buffer async)))) (py-execute-buffer async))))
......
...@@ -317,7 +317,7 @@ Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj) ...@@ -317,7 +317,7 @@ Py_UniversalNewlineFgets(char *buf, int n, FILE *stream, PyObject *fobj)
** will cause a pause if we're reading from an ** will cause a pause if we're reading from an
** interactive stream, but that is very unlikely ** interactive stream, but that is very unlikely
** unless we're doing something silly like ** unless we're doing something silly like
** execfile("/dev/tty"). ** exec(open("/dev/tty").read()).
*/ */
c = GETC(stream); c = GETC(stream);
if ( c != '\n' ) if ( c != '\n' )
......
...@@ -641,107 +641,6 @@ The globals and locals are dictionaries, defaulting to the current\n\ ...@@ -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."); 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 * static PyObject *
builtin_getattr(PyObject *self, PyObject *args) builtin_getattr(PyObject *self, PyObject *args)
{ {
...@@ -1737,7 +1636,6 @@ static PyMethodDef builtin_methods[] = { ...@@ -1737,7 +1636,6 @@ static PyMethodDef builtin_methods[] = {
{"divmod", builtin_divmod, METH_VARARGS, divmod_doc}, {"divmod", builtin_divmod, METH_VARARGS, divmod_doc},
{"eval", builtin_eval, METH_VARARGS, eval_doc}, {"eval", builtin_eval, METH_VARARGS, eval_doc},
{"exec", builtin_exec, METH_VARARGS, exec_doc}, {"exec", builtin_exec, METH_VARARGS, exec_doc},
{"execfile", builtin_execfile, METH_VARARGS, execfile_doc},
{"filter", builtin_filter, METH_VARARGS, filter_doc}, {"filter", builtin_filter, METH_VARARGS, filter_doc},
{"getattr", builtin_getattr, METH_VARARGS, getattr_doc}, {"getattr", builtin_getattr, METH_VARARGS, getattr_doc},
{"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc}, {"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc},
......
...@@ -1101,7 +1101,7 @@ Modules/getpath.o. ...@@ -1101,7 +1101,7 @@ Modules/getpath.o.
--with(out)-universal-newlines: enable reading of text files with --with(out)-universal-newlines: enable reading of text files with
foreign newline convention (default: enabled). In other words, foreign newline convention (default: enabled). In other words,
any of \r, \n or \r\n is acceptable as end-of-line character. 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 in files. Python code can open a file with open(file, 'U') to
read it in universal newline mode. THIS OPTION IS UNSUPPORTED. read it in universal newline mode. THIS OPTION IS UNSUPPORTED.
......
...@@ -23,7 +23,12 @@ def run_hotshot(filename, profile, args): ...@@ -23,7 +23,12 @@ def run_hotshot(filename, profile, args):
prof = hotshot.Profile(profile) prof = hotshot.Profile(profile)
sys.path.insert(0, os.path.dirname(filename)) sys.path.insert(0, os.path.dirname(filename))
sys.argv = [filename] + args 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() prof.close()
stats = hotshot.stats.load(profile) stats = hotshot.stats.load(profile)
stats.sort_stats("time", "calls") stats.sort_stats("time", "calls")
......
...@@ -19,7 +19,7 @@ your distribution. In stead of a single URL you can also specify a list ...@@ -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, 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 this is handy for distributions that live in multiple places. Put the
primary distribution site (the most up-to-date site) before others. 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, directory is the checkversion directory, so be careful with globals,
importing, etc. importing, etc.
......
...@@ -26,7 +26,7 @@ def check1dir(dummy, dir, files): ...@@ -26,7 +26,7 @@ def check1dir(dummy, dir, files):
if CHECKNAME in files: if CHECKNAME in files:
fullname = os.path.join(dir, CHECKNAME) fullname = os.path.join(dir, CHECKNAME)
try: try:
execfile(fullname) exec(open(fullname).read())
except: except:
print('** Exception in', fullname) print('** Exception in', fullname)
......
...@@ -1369,7 +1369,12 @@ class PyBuildExt(build_ext): ...@@ -1369,7 +1369,12 @@ class PyBuildExt(build_ext):
return False return False
fficonfig = {} 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') ffi_srcdir = os.path.join(fficonfig['ffi_srcdir'], 'src')
# Add .S (preprocessed assembly) to C compiler source extensions. # Add .S (preprocessed assembly) to C compiler source extensions.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment