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