1 # encoding: utf-8 2 """ 3 Utilities for getting information about IPython and the system it's running in. 4 """ 5 6 #----------------------------------------------------------------------------- 7 # Copyright (C) 2008-2011 The IPython Development Team 8 # 9 # Distributed under the terms of the BSD License. The full license is in 10 # the file COPYING, distributed as part of this software. 11 #----------------------------------------------------------------------------- 12 13 #----------------------------------------------------------------------------- 14 # Imports 15 #----------------------------------------------------------------------------- 16 17 import os 18 import platform 19 import pprint 20 import sys 21 import subprocess 22 23 from pathlib import Path 24 25 from IPython.core import release 26 from IPython.utils import _sysinfo, encoding 27 28 #----------------------------------------------------------------------------- 29 # Code 30 #----------------------------------------------------------------------------- 31 32 def pkg_commit_hash(pkg_path: str) -> tuple[str, str]: 33 """Get short form of commit hash given directory `pkg_path` 34 35 We get the commit hash from (in order of preference): 36 37 * IPython.utils._sysinfo.commit 38 * git output, if we are in a git repository 39 40 If these fail, we return a not-found placeholder tuple 41 42 Parameters 43 ---------- 44 pkg_path : str 45 directory containing package 46 only used for getting commit from active repo 47 48 Returns 49 ------- 50 hash_from : str 51 Where we got the hash from - description 52 hash_str : str 53 short form of hash 54 """ 55 # Try and get commit from written commit text file 56 if _sysinfo.commit: 57 return "installation", _sysinfo.commit 58 59 # maybe we are in a repository 60 proc = subprocess.Popen('git rev-parse --short HEAD'.split(' '), 61 stdout=subprocess.PIPE, 62 stderr=subprocess.PIPE, 63 cwd=pkg_path) 64 repo_commit, _ = proc.communicate() 65 if repo_commit: 66 return 'repository', repo_commit.strip().decode('ascii') 67 return '(none found)', '<not found>' 68 69 70 def pkg_info(pkg_path: str) -> dict: 71 """Return dict describing the context of this package 72 73 Parameters 74 ---------- 75 pkg_path : str 76 path containing __init__.py for package 77 78 Returns 79 ------- 80 context : dict 81 with named parameters of interest 82 """ 83 src, hsh = pkg_commit_hash(pkg_path) 84 return dict( 85 ipython_version=release.version, 86 ipython_path=pkg_path, 87 commit_source=src, 88 commit_hash=hsh, 89 sys_version=sys.version, 90 sys_executable=sys.executable, 91 sys_platform=sys.platform, 92 platform=platform.platform(), 93 os_name=os.name, 94 default_encoding=encoding.DEFAULT_ENCODING, 95 ) 96 97 def get_sys_info() -> dict: 98 """Return useful information about IPython and the system, as a dict.""" 99 path = Path(__file__, "..").resolve().parent 100 return pkg_info(str(path)) 101 102 def sys_info() -> str: 103 """Return useful information about IPython and the system, as a string. 104 105 Examples 106 -------- 107 :: 108 109 In [2]: print(sys_info()) 110 {'commit_hash': '144fdae', # random 111 'commit_source': 'repository', 112 'ipython_path': '/home/fperez/usr/lib/python2.6/site-packages/IPython', 113 'ipython_version': '0.11.dev', 114 'os_name': 'posix', 115 'platform': 'Linux-2.6.35-22-generic-i686-with-Ubuntu-10.10-maverick', 116 'sys_executable': '/usr/bin/python', 117 'sys_platform': 'linux2', 118 'sys_version': '2.6.6 (r266:84292, Sep 15 2010, 15:52:39) \\n[GCC 4.4.5]'} 119 """ 120 return pprint.pformat(get_sys_info()) 121 122 123 def num_cpus(): 124 """DEPRECATED 125 126 Return the effective number of CPUs in the system as an integer. 127 128 This cross-platform function makes an attempt at finding the total number of 129 available CPUs in the system, as returned by various underlying system and 130 python calls. 131 132 If it can't find a sensible answer, it returns 1 (though an error *may* make 133 it return a large positive number that's actually incorrect). 134 """ 135 import warnings 136 137 warnings.warn( 138 "`num_cpus` is deprecated since IPython 8.0. Use `os.cpu_count` instead.", 139 DeprecationWarning, 140 stacklevel=2, 141 ) 142 143 return os.cpu_count() or 1 144