|
|
# encoding: utf-8
|
|
|
"""
|
|
|
Utilities for getting information about a system.
|
|
|
"""
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Copyright (C) 2008-2009 The IPython Development Team
|
|
|
#
|
|
|
# Distributed under the terms of the BSD License. The full license is in
|
|
|
# the file COPYING, distributed as part of this software.
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Imports
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
import os
|
|
|
import platform
|
|
|
import sys
|
|
|
import subprocess
|
|
|
|
|
|
from IPython.core import release
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
# Code
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
|
def sys_info():
|
|
|
"""Return useful information about IPython and the system, as a string.
|
|
|
|
|
|
Examples
|
|
|
--------
|
|
|
In [1]: print(sys_info())
|
|
|
IPython version: 0.11.bzr.r1340 # random
|
|
|
BZR revision : 1340
|
|
|
Platform info : os.name -> posix, sys.platform -> linux2
|
|
|
: Linux-2.6.31-17-generic-i686-with-Ubuntu-9.10-karmic
|
|
|
Python info : 2.6.4 (r264:75706, Dec 7 2009, 18:45:15)
|
|
|
[GCC 4.4.1]
|
|
|
"""
|
|
|
out = []
|
|
|
out.append('IPython version: %s' % release.version)
|
|
|
out.append('BZR revision : %s' % release.revision)
|
|
|
out.append('Platform info : os.name -> %s, sys.platform -> %s' %
|
|
|
(os.name,sys.platform) )
|
|
|
out.append(' : %s' % platform.platform())
|
|
|
out.append('Python info : %s' % sys.version)
|
|
|
out.append('') # ensure closing newline
|
|
|
return '\n'.join(out)
|
|
|
|
|
|
|
|
|
def _num_cpus_unix():
|
|
|
"""Return the number of active CPUs on a Unix system."""
|
|
|
return os.sysconf("SC_NPROCESSORS_ONLN")
|
|
|
|
|
|
|
|
|
def _num_cpus_darwin():
|
|
|
"""Return the number of active CPUs on a Darwin system."""
|
|
|
p = subprocess.Popen(['sysctl','-n','hw.ncpu'],stdout=subprocess.PIPE)
|
|
|
return p.stdout.read()
|
|
|
|
|
|
|
|
|
def _num_cpus_windows():
|
|
|
"""Return the number of active CPUs on a Windows system."""
|
|
|
return os.environ.get("NUMBER_OF_PROCESSORS")
|
|
|
|
|
|
|
|
|
def num_cpus():
|
|
|
"""Return the effective number of CPUs in the system as an integer.
|
|
|
|
|
|
This cross-platform function makes an attempt at finding the total number of
|
|
|
available CPUs in the system, as returned by various underlying system and
|
|
|
python calls.
|
|
|
|
|
|
If it can't find a sensible answer, it returns 1 (though an error *may* make
|
|
|
it return a large positive number that's actually incorrect).
|
|
|
"""
|
|
|
|
|
|
# Many thanks to the Parallel Python project (http://www.parallelpython.com)
|
|
|
# for the names of the keys we needed to look up for this function. This
|
|
|
# code was inspired by their equivalent function.
|
|
|
|
|
|
ncpufuncs = {'Linux':_num_cpus_unix,
|
|
|
'Darwin':_num_cpus_darwin,
|
|
|
'Windows':_num_cpus_windows,
|
|
|
# On Vista, python < 2.5.2 has a bug and returns 'Microsoft'
|
|
|
# See http://bugs.python.org/issue1082 for details.
|
|
|
'Microsoft':_num_cpus_windows,
|
|
|
}
|
|
|
|
|
|
ncpufunc = ncpufuncs.get(platform.system(),
|
|
|
# default to unix version (Solaris, AIX, etc)
|
|
|
_num_cpus_unix)
|
|
|
|
|
|
try:
|
|
|
ncpus = max(1,int(ncpufunc()))
|
|
|
except:
|
|
|
ncpus = 1
|
|
|
return ncpus
|
|
|
|
|
|
|