sysinfo.py
166 lines
| 5.0 KiB
| text/x-python
|
PythonLexer
Brian Granger
|
r2498 | # encoding: utf-8 | ||
""" | ||||
Fernando Perez
|
r3204 | Utilities for getting information about IPython and the system it's running in. | ||
Brian Granger
|
r2498 | """ | ||
#----------------------------------------------------------------------------- | ||||
Matthias BUSSONNIER
|
r5390 | # Copyright (C) 2008-2011 The IPython Development Team | ||
Brian Granger
|
r2498 | # | ||
# 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 | ||||
Fernando Perez
|
r3204 | import pprint | ||
Brian Granger
|
r2498 | import sys | ||
import subprocess | ||||
from IPython.core import release | ||||
Matthias Bussonnier
|
r24265 | from IPython.utils import _sysinfo, encoding | ||
Fernando Perez
|
r3204 | |||
#----------------------------------------------------------------------------- | ||||
Brian Granger
|
r2498 | # Code | ||
#----------------------------------------------------------------------------- | ||||
Fernando Perez
|
r3204 | def pkg_commit_hash(pkg_path): | ||
"""Get short form of commit hash given directory `pkg_path` | ||||
We get the commit hash from (in order of preference): | ||||
MinRK
|
r6315 | * IPython.utils._sysinfo.commit | ||
Fernando Perez
|
r3204 | * git output, if we are in a git repository | ||
MinRK
|
r6315 | If these fail, we return a not-found placeholder tuple | ||
Fernando Perez
|
r3204 | |||
Parameters | ||||
---------- | ||||
pkg_path : str | ||||
Matthias Bussonnier
|
r26419 | directory containing package | ||
only used for getting commit from active repo | ||||
Fernando Perez
|
r3204 | |||
Returns | ||||
------- | ||||
hash_from : str | ||||
Matthias Bussonnier
|
r26419 | Where we got the hash from - description | ||
Fernando Perez
|
r3204 | hash_str : str | ||
Matthias Bussonnier
|
r26419 | short form of hash | ||
Fernando Perez
|
r3204 | """ | ||
# Try and get commit from written commit text file | ||||
MinRK
|
r6315 | if _sysinfo.commit: | ||
return "installation", _sysinfo.commit | ||||
Fernando Perez
|
r3204 | # maybe we are in a repository | ||
Matthias Bussonnier
|
r25339 | proc = subprocess.Popen('git rev-parse --short HEAD'.split(' '), | ||
Fernando Perez
|
r3204 | stdout=subprocess.PIPE, | ||
stderr=subprocess.PIPE, | ||||
Matthias Bussonnier
|
r25339 | cwd=pkg_path) | ||
Fernando Perez
|
r3204 | repo_commit, _ = proc.communicate() | ||
if repo_commit: | ||||
Matthias Bussonnier
|
r18039 | return 'repository', repo_commit.strip().decode('ascii') | ||
Srinivas Reddy Thatiparthy
|
r23213 | return '(none found)', '<not found>' | ||
Fernando Perez
|
r3204 | |||
def pkg_info(pkg_path): | ||||
"""Return dict describing the context of this package | ||||
Parameters | ||||
---------- | ||||
pkg_path : str | ||||
Matthias Bussonnier
|
r26419 | path containing __init__.py for package | ||
Fernando Perez
|
r3204 | |||
Returns | ||||
------- | ||||
context : dict | ||||
Matthias Bussonnier
|
r26419 | with named parameters of interest | ||
Fernando Perez
|
r3204 | """ | ||
src, hsh = pkg_commit_hash(pkg_path) | ||||
return dict( | ||||
ipython_version=release.version, | ||||
ipython_path=pkg_path, | ||||
commit_source=src, | ||||
commit_hash=hsh, | ||||
sys_version=sys.version, | ||||
sys_executable=sys.executable, | ||||
sys_platform=sys.platform, | ||||
platform=platform.platform(), | ||||
os_name=os.name, | ||||
MinRK
|
r7649 | default_encoding=encoding.DEFAULT_ENCODING, | ||
Fernando Perez
|
r3204 | ) | ||
Thomas Kluyver
|
r13173 | def get_sys_info(): | ||
"""Return useful information about IPython and the system, as a dict.""" | ||||
p = os.path | ||||
Thomas Kluyver
|
r16457 | path = p.realpath(p.dirname(p.abspath(p.join(__file__, '..')))) | ||
Thomas Kluyver
|
r13173 | return pkg_info(path) | ||
Fernando Perez
|
r3204 | |||
Brian Granger
|
r2498 | def sys_info(): | ||
"""Return useful information about IPython and the system, as a string. | ||||
Thomas Kluyver
|
r12553 | Examples | ||
-------- | ||||
:: | ||||
Matthias Bussonnier
|
r24265 | In [2]: print(sys_info()) | ||
Thomas Kluyver
|
r12553 | {'commit_hash': '144fdae', # random | ||
'commit_source': 'repository', | ||||
'ipython_path': '/home/fperez/usr/lib/python2.6/site-packages/IPython', | ||||
'ipython_version': '0.11.dev', | ||||
'os_name': 'posix', | ||||
'platform': 'Linux-2.6.35-22-generic-i686-with-Ubuntu-10.10-maverick', | ||||
'sys_executable': '/usr/bin/python', | ||||
'sys_platform': 'linux2', | ||||
'sys_version': '2.6.6 (r266:84292, Sep 15 2010, 15:52:39) \\n[GCC 4.4.5]'} | ||||
Thomas Kluyver
|
r12971 | """ | ||
Thomas Kluyver
|
r13173 | return pprint.pformat(get_sys_info()) | ||
Brian Granger
|
r2498 | |||
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, | ||||
Matthias Bussonnier
|
r18041 | 'Windows':_num_cpus_windows | ||
Brian Granger
|
r2498 | } | ||
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 | ||||