|
|
|
""" |
|
Utilities for getting information about IPython and the system it's running in. |
|
""" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import os |
|
import platform |
|
import pprint |
|
import sys |
|
import subprocess |
|
|
|
from IPython.core import release |
|
from IPython.utils import _sysinfo, encoding |
|
|
|
|
|
|
|
|
|
|
|
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): |
|
|
|
* IPython.utils._sysinfo.commit |
|
* git output, if we are in a git repository |
|
|
|
If these fail, we return a not-found placeholder tuple |
|
|
|
Parameters |
|
---------- |
|
pkg_path : str |
|
directory containing package |
|
only used for getting commit from active repo |
|
|
|
Returns |
|
------- |
|
hash_from : str |
|
Where we got the hash from - description |
|
hash_str : str |
|
short form of hash |
|
""" |
|
|
|
if _sysinfo.commit: |
|
return "installation", _sysinfo.commit |
|
|
|
|
|
proc = subprocess.Popen('git rev-parse --short HEAD'.split(' '), |
|
stdout=subprocess.PIPE, |
|
stderr=subprocess.PIPE, |
|
cwd=pkg_path) |
|
repo_commit, _ = proc.communicate() |
|
if repo_commit: |
|
return 'repository', repo_commit.strip().decode('ascii') |
|
return '(none found)', '<not found>' |
|
|
|
|
|
def pkg_info(pkg_path): |
|
"""Return dict describing the context of this package |
|
|
|
Parameters |
|
---------- |
|
pkg_path : str |
|
path containing __init__.py for package |
|
|
|
Returns |
|
------- |
|
context : dict |
|
with named parameters of interest |
|
""" |
|
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, |
|
default_encoding=encoding.DEFAULT_ENCODING, |
|
) |
|
|
|
def get_sys_info(): |
|
"""Return useful information about IPython and the system, as a dict.""" |
|
p = os.path |
|
path = p.realpath(p.dirname(p.abspath(p.join(__file__, '..')))) |
|
return pkg_info(path) |
|
|
|
def sys_info(): |
|
"""Return useful information about IPython and the system, as a string. |
|
|
|
Examples |
|
-------- |
|
:: |
|
|
|
In [2]: print(sys_info()) |
|
{'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]'} |
|
""" |
|
return pprint.pformat(get_sys_info()) |
|
|
|
|
|
def num_cpus(): |
|
"""DEPRECATED |
|
|
|
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). |
|
""" |
|
import warnings |
|
|
|
warnings.warn( |
|
"`num_cpus` is deprecated since IPython 8.0. Use `os.cpu_count` instead.", |
|
DeprecationWarning, |
|
stacklevel=2, |
|
) |
|
|
|
return os.cpu_count() or 1 |
|
|