Index: twisted/python/dist.py
===================================================================
--- twisted/python/dist.py	(Revision 28155)
+++ twisted/python/dist.py	(Arbeitskopie)
@@ -15,10 +15,7 @@
 from distutils import core
 from distutils.core import Extension
 
-try:
-    execfile
-except NameError:
-    from twisted.python.compat import execfile
+from twisted.python.compat import execfile
 
 
 twisted_subprojects = ["conch", "lore", "mail", "names",
Index: twisted/python/compat.py
===================================================================
--- twisted/python/compat.py	(Revision 28155)
+++ twisted/python/compat.py	(Arbeitskopie)
@@ -15,8 +15,14 @@
 import sys, string, socket, struct
 
 
-def execfile(filename, *args):
-    return exec(compile(open(filename).read(), filename, 'exec'), *args)
+if sys.version_info >= (3,0):
+    # 3.x doesn't have execfile anymore, so we define our own
+    # The code below is syntactically valid 2.x, but 2.x thinks that a tuple
+    # gets passed to the exec statement.
+    def execfile(filename, globals=None, locals=None):
+        exec(compile(open(filename).read(), filename, 'exec'), globals, locals)
+else:
+    from __builtin__ import execfile
 
 
 def inet_pton(af, addr):
Index: setup.py
===================================================================
--- setup.py	(Revision 28155)
+++ setup.py	(Arbeitskopie)
@@ -16,10 +16,7 @@
 import sys, os
 
 
-try:
-    execfile
-except NameError:
-    from twisted.python.compat import execfile
+from twisted.python.compat import execfile
 
 
 def getExtensions():
