[Numpy-discussion] numscons and Python 2.7 problems

Christoph Gohlke cgohlke@uci....
Mon Jun 7 15:07:04 CDT 2010

Dear NumPy developers,

I was trying to build numpy 2.0.dev and scipy 0.9.dev using numscons 
0.12.dev and Python 2.7b2 (32 bit) on Windows 7 64 bit and ran into two 

First, Python 2.7's UserDict is now a new-style class 
(http://docs.python.org/dev/whatsnew/2.7.html). Apparently scons 1.2, 
which is part of numscons, is not compatible with this change and an 
AttributeError is thrown:

AttributeError: NumpyEnvironment instance has no attribute 'SubstInFile':
   File "D:\numpy-trunk\numpy\core\SConstruct", line 2:
   File "C:\Python27\lib\site-packages\numscons\core\numpyenv.py", line 135:
     build_dir = '$build_dir', src_dir = '$src_dir')
line 553:
     return apply(_SConscript, [self.fs,] + files, subst_kw)
line 262:
     exec _file_ in call_stack[-1].globals
   File "D:\numpy-trunk\build\scons\numpy\core\SConscript", line 353:
     target = env.SubstInFile(pjoin(include_dir, '_numpyconfig.h'),

Turns out that the env['BUILDERS'] dictionary is empty after the 
config.Finish() call in SConscript. A workaround is to copy the 
UserDict.py file from Python27\Lib to 
numscons\scons-local\scons-local-1.2.0\SCons and change UserDict back to 
an old-style class:

@@ -1,6 +1,6 @@
  """A more or less complete user-defined wrapper around dictionary 

-class UserDict(object):
+class UserDict:
      def __init__(self, dict=None, **kwargs):
          self.data = {}
          if dict is not None:
@@ -80,10 +80,7 @@
      def __iter__(self):
          return iter(self.data)

-import _abcoll

  class DictMixin:
      # Mixin defining all dictionary methods for classes that already have
      # a minimum dictionary interface including getitem, setitem, delitem,

Second, when Python 2.7 is run on a 64 bit host, sys.platform.machine() 
is 'AMD64' even if Python is 32 bit (http://bugs.python.org/issue7860). 
Hence numscons always uses the win64 configuration on Python 2.7. This 
can be fixed by using "if '64 bit' in sys.version" or 
"platform.architecture()[0] == '64bit'" instead of "platform.machine() 
== 'AMD64'":

diff --git a/numscons/checkers/config.py b/numscons/checkers/config.py
index 4ca1079..198ccdb 100644
--- a/numscons/checkers/config.py
+++ b/numscons/checkers/config.py
@@ -18,7 +18,7 @@ def _get_win32_config_files():
      import platform

      files = [pjoin(_CONFDIR, 'win32', 'perflib.cfg')]
-    if platform.machine() == 'AMD64':
+    if platform.architecture()[0] == '64bit':
          files.append(pjoin(_CONFDIR, 'win64', 'perflib.cfg'))
      return files

diff --git a/numscons/core/compiler_config.py 
index d6a79d9..606963e 100644
--- a/numscons/core/compiler_config.py
+++ b/numscons/core/compiler_config.py
@@ -29,7 +29,7 @@ def _get_win32_config_files(filename):
      import platform

      files = [pjoin(_CONFDIR, 'win32', filename)]
-    if platform.machine() == 'AMD64':
+    if platform.architecture()[0] == '64bit':
          files.append(pjoin(_CONFDIR, 'win64', filename))
      return files

diff --git a/numscons/core/misc.py b/numscons/core/misc.py
index a546122..42836b9 100644
--- a/numscons/core/misc.py
+++ b/numscons/core/misc.py
@@ -59,7 +59,7 @@ def built_with_ifort(env):
  def is_python_win64():
      # XXX: import it here because it takes some time
      import platform
-    return sys.platform == "win32" and platform.machine() == "AMD64"
+    return sys.platform == "win32" and platform.architecture()[0] == 

  def get_pythonlib_name(debug = 0):
      """Return the name of python library (necessary to link on NT with


More information about the NumPy-Discussion mailing list