##// END OF EJS Templates
add codename to sys_info
MinRK -
Show More
@@ -1,166 +1,167 b''
1 # encoding: utf-8
1 # encoding: utf-8
2 """
2 """
3 Utilities for getting information about IPython and the system it's running in.
3 Utilities for getting information about IPython and the system it's running in.
4 """
4 """
5
5
6 #-----------------------------------------------------------------------------
6 #-----------------------------------------------------------------------------
7 # Copyright (C) 2008-2011 The IPython Development Team
7 # Copyright (C) 2008-2011 The IPython Development Team
8 #
8 #
9 # Distributed under the terms of the BSD License. The full license is in
9 # Distributed under the terms of the BSD License. The full license is in
10 # the file COPYING, distributed as part of this software.
10 # the file COPYING, distributed as part of this software.
11 #-----------------------------------------------------------------------------
11 #-----------------------------------------------------------------------------
12
12
13 #-----------------------------------------------------------------------------
13 #-----------------------------------------------------------------------------
14 # Imports
14 # Imports
15 #-----------------------------------------------------------------------------
15 #-----------------------------------------------------------------------------
16
16
17 import os
17 import os
18 import platform
18 import platform
19 import pprint
19 import pprint
20 import sys
20 import sys
21 import subprocess
21 import subprocess
22
22
23 from IPython.core import release
23 from IPython.core import release
24 from IPython.utils import py3compat, _sysinfo, encoding
24 from IPython.utils import py3compat, _sysinfo, encoding
25
25
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27 # Code
27 # Code
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29
29
30 def pkg_commit_hash(pkg_path):
30 def pkg_commit_hash(pkg_path):
31 """Get short form of commit hash given directory `pkg_path`
31 """Get short form of commit hash given directory `pkg_path`
32
32
33 We get the commit hash from (in order of preference):
33 We get the commit hash from (in order of preference):
34
34
35 * IPython.utils._sysinfo.commit
35 * IPython.utils._sysinfo.commit
36 * git output, if we are in a git repository
36 * git output, if we are in a git repository
37
37
38 If these fail, we return a not-found placeholder tuple
38 If these fail, we return a not-found placeholder tuple
39
39
40 Parameters
40 Parameters
41 ----------
41 ----------
42 pkg_path : str
42 pkg_path : str
43 directory containing package
43 directory containing package
44 only used for getting commit from active repo
44 only used for getting commit from active repo
45
45
46 Returns
46 Returns
47 -------
47 -------
48 hash_from : str
48 hash_from : str
49 Where we got the hash from - description
49 Where we got the hash from - description
50 hash_str : str
50 hash_str : str
51 short form of hash
51 short form of hash
52 """
52 """
53 # Try and get commit from written commit text file
53 # Try and get commit from written commit text file
54 if _sysinfo.commit:
54 if _sysinfo.commit:
55 return "installation", _sysinfo.commit
55 return "installation", _sysinfo.commit
56
56
57 # maybe we are in a repository
57 # maybe we are in a repository
58 proc = subprocess.Popen('git rev-parse --short HEAD',
58 proc = subprocess.Popen('git rev-parse --short HEAD',
59 stdout=subprocess.PIPE,
59 stdout=subprocess.PIPE,
60 stderr=subprocess.PIPE,
60 stderr=subprocess.PIPE,
61 cwd=pkg_path, shell=True)
61 cwd=pkg_path, shell=True)
62 repo_commit, _ = proc.communicate()
62 repo_commit, _ = proc.communicate()
63 if repo_commit:
63 if repo_commit:
64 return 'repository', repo_commit.strip()
64 return 'repository', repo_commit.strip()
65 return '(none found)', '<not found>'
65 return '(none found)', '<not found>'
66
66
67
67
68 def pkg_info(pkg_path):
68 def pkg_info(pkg_path):
69 """Return dict describing the context of this package
69 """Return dict describing the context of this package
70
70
71 Parameters
71 Parameters
72 ----------
72 ----------
73 pkg_path : str
73 pkg_path : str
74 path containing __init__.py for package
74 path containing __init__.py for package
75
75
76 Returns
76 Returns
77 -------
77 -------
78 context : dict
78 context : dict
79 with named parameters of interest
79 with named parameters of interest
80 """
80 """
81 src, hsh = pkg_commit_hash(pkg_path)
81 src, hsh = pkg_commit_hash(pkg_path)
82 return dict(
82 return dict(
83 ipython_version=release.version,
83 ipython_version=release.version,
84 ipython_path=pkg_path,
84 ipython_path=pkg_path,
85 codename=release.codename,
85 commit_source=src,
86 commit_source=src,
86 commit_hash=hsh,
87 commit_hash=hsh,
87 sys_version=sys.version,
88 sys_version=sys.version,
88 sys_executable=sys.executable,
89 sys_executable=sys.executable,
89 sys_platform=sys.platform,
90 sys_platform=sys.platform,
90 platform=platform.platform(),
91 platform=platform.platform(),
91 os_name=os.name,
92 os_name=os.name,
92 default_encoding=encoding.DEFAULT_ENCODING,
93 default_encoding=encoding.DEFAULT_ENCODING,
93 )
94 )
94
95
95
96
96 @py3compat.doctest_refactor_print
97 @py3compat.doctest_refactor_print
97 def sys_info():
98 def sys_info():
98 """Return useful information about IPython and the system, as a string.
99 """Return useful information about IPython and the system, as a string.
99
100
100 Example
101 Example
101 -------
102 -------
102 In [2]: print sys_info()
103 In [2]: print sys_info()
103 {'commit_hash': '144fdae', # random
104 {'commit_hash': '144fdae', # random
104 'commit_source': 'repository',
105 'commit_source': 'repository',
105 'ipython_path': '/home/fperez/usr/lib/python2.6/site-packages/IPython',
106 'ipython_path': '/home/fperez/usr/lib/python2.6/site-packages/IPython',
106 'ipython_version': '0.11.dev',
107 'ipython_version': '0.11.dev',
107 'os_name': 'posix',
108 'os_name': 'posix',
108 'platform': 'Linux-2.6.35-22-generic-i686-with-Ubuntu-10.10-maverick',
109 'platform': 'Linux-2.6.35-22-generic-i686-with-Ubuntu-10.10-maverick',
109 'sys_executable': '/usr/bin/python',
110 'sys_executable': '/usr/bin/python',
110 'sys_platform': 'linux2',
111 'sys_platform': 'linux2',
111 'sys_version': '2.6.6 (r266:84292, Sep 15 2010, 15:52:39) \\n[GCC 4.4.5]'}
112 'sys_version': '2.6.6 (r266:84292, Sep 15 2010, 15:52:39) \\n[GCC 4.4.5]'}
112 """
113 """
113 p = os.path
114 p = os.path
114 path = p.dirname(p.abspath(p.join(__file__, '..')))
115 path = p.dirname(p.abspath(p.join(__file__, '..')))
115 return pprint.pformat(pkg_info(path))
116 return pprint.pformat(pkg_info(path))
116
117
117
118
118 def _num_cpus_unix():
119 def _num_cpus_unix():
119 """Return the number of active CPUs on a Unix system."""
120 """Return the number of active CPUs on a Unix system."""
120 return os.sysconf("SC_NPROCESSORS_ONLN")
121 return os.sysconf("SC_NPROCESSORS_ONLN")
121
122
122
123
123 def _num_cpus_darwin():
124 def _num_cpus_darwin():
124 """Return the number of active CPUs on a Darwin system."""
125 """Return the number of active CPUs on a Darwin system."""
125 p = subprocess.Popen(['sysctl','-n','hw.ncpu'],stdout=subprocess.PIPE)
126 p = subprocess.Popen(['sysctl','-n','hw.ncpu'],stdout=subprocess.PIPE)
126 return p.stdout.read()
127 return p.stdout.read()
127
128
128
129
129 def _num_cpus_windows():
130 def _num_cpus_windows():
130 """Return the number of active CPUs on a Windows system."""
131 """Return the number of active CPUs on a Windows system."""
131 return os.environ.get("NUMBER_OF_PROCESSORS")
132 return os.environ.get("NUMBER_OF_PROCESSORS")
132
133
133
134
134 def num_cpus():
135 def num_cpus():
135 """Return the effective number of CPUs in the system as an integer.
136 """Return the effective number of CPUs in the system as an integer.
136
137
137 This cross-platform function makes an attempt at finding the total number of
138 This cross-platform function makes an attempt at finding the total number of
138 available CPUs in the system, as returned by various underlying system and
139 available CPUs in the system, as returned by various underlying system and
139 python calls.
140 python calls.
140
141
141 If it can't find a sensible answer, it returns 1 (though an error *may* make
142 If it can't find a sensible answer, it returns 1 (though an error *may* make
142 it return a large positive number that's actually incorrect).
143 it return a large positive number that's actually incorrect).
143 """
144 """
144
145
145 # Many thanks to the Parallel Python project (http://www.parallelpython.com)
146 # Many thanks to the Parallel Python project (http://www.parallelpython.com)
146 # for the names of the keys we needed to look up for this function. This
147 # for the names of the keys we needed to look up for this function. This
147 # code was inspired by their equivalent function.
148 # code was inspired by their equivalent function.
148
149
149 ncpufuncs = {'Linux':_num_cpus_unix,
150 ncpufuncs = {'Linux':_num_cpus_unix,
150 'Darwin':_num_cpus_darwin,
151 'Darwin':_num_cpus_darwin,
151 'Windows':_num_cpus_windows,
152 'Windows':_num_cpus_windows,
152 # On Vista, python < 2.5.2 has a bug and returns 'Microsoft'
153 # On Vista, python < 2.5.2 has a bug and returns 'Microsoft'
153 # See http://bugs.python.org/issue1082 for details.
154 # See http://bugs.python.org/issue1082 for details.
154 'Microsoft':_num_cpus_windows,
155 'Microsoft':_num_cpus_windows,
155 }
156 }
156
157
157 ncpufunc = ncpufuncs.get(platform.system(),
158 ncpufunc = ncpufuncs.get(platform.system(),
158 # default to unix version (Solaris, AIX, etc)
159 # default to unix version (Solaris, AIX, etc)
159 _num_cpus_unix)
160 _num_cpus_unix)
160
161
161 try:
162 try:
162 ncpus = max(1,int(ncpufunc()))
163 ncpus = max(1,int(ncpufunc()))
163 except:
164 except:
164 ncpus = 1
165 ncpus = 1
165 return ncpus
166 return ncpus
166
167
General Comments 0
You need to be logged in to leave comments. Login now