|
@@
-1,342
+1,479
b''
|
|
1
|
.. _config_overview:
|
|
1
|
.. _config_overview:
|
|
2
|
|
|
2
|
|
|
3
|
============================================
|
|
3
|
============================================
|
|
4
|
Overview of the IPython configuration system
|
|
4
|
Overview of the IPython configuration system
|
|
5
|
============================================
|
|
5
|
============================================
|
|
6
|
|
|
6
|
|
|
7
|
This section describes the IPython configuration system. Starting with version
|
|
7
|
This section describes the IPython configuration system. Starting with version
|
|
8
|
0.11, IPython has a completely new configuration system that is quite
|
|
8
|
0.11, IPython has a completely new configuration system that is quite
|
|
9
|
different from the older :file:`ipythonrc` or :file:`ipy_user_conf.py`
|
|
9
|
different from the older :file:`ipythonrc` or :file:`ipy_user_conf.py`
|
|
10
|
approaches. The new configuration system was designed from scratch to address
|
|
10
|
approaches. The new configuration system was designed from scratch to address
|
|
11
|
the particular configuration needs of IPython. While there are many
|
|
11
|
the particular configuration needs of IPython. While there are many
|
|
12
|
other excellent configuration systems out there, we found that none of them
|
|
12
|
other excellent configuration systems out there, we found that none of them
|
|
13
|
met our requirements.
|
|
13
|
met our requirements.
|
|
14
|
|
|
14
|
|
|
15
|
.. warning::
|
|
15
|
.. warning::
|
|
16
|
|
|
16
|
|
|
17
|
If you are upgrading to version 0.11 of IPython, you will need to migrate
|
|
17
|
If you are upgrading to version 0.11 of IPython, you will need to migrate
|
|
18
|
your old :file:`ipythonrc` or :file:`ipy_user_conf.py` configuration files
|
|
18
|
your old :file:`ipythonrc` or :file:`ipy_user_conf.py` configuration files
|
|
19
|
to the new system. Read on for information on how to do this.
|
|
19
|
to the new system. Read on for information on how to do this.
|
|
20
|
|
|
20
|
|
|
21
|
The discussion that follows is focused on teaching user's how to configure
|
|
21
|
The discussion that follows is focused on teaching users how to configure
|
|
22
|
IPython to their liking. Developer's who want to know more about how they
|
|
22
|
IPython to their liking. Developers who want to know more about how they
|
|
23
|
can enable their objects to take advantage of the configuration system
|
|
23
|
can enable their objects to take advantage of the configuration system
|
|
24
|
should consult our :ref:`developer guide <developer_guide>`
|
|
24
|
should consult our :ref:`developer guide <developer_guide>`
|
|
25
|
|
|
25
|
|
|
26
|
The main concepts
|
|
26
|
The main concepts
|
|
27
|
=================
|
|
27
|
=================
|
|
28
|
|
|
28
|
|
|
29
|
There are a number of abstractions that the IPython configuration system uses.
|
|
29
|
There are a number of abstractions that the IPython configuration system uses.
|
|
30
|
Each of these abstractions is represented by a Python class.
|
|
30
|
Each of these abstractions is represented by a Python class.
|
|
31
|
|
|
31
|
|
|
32
|
Configuration object: :class:`~IPython.config.loader.Config`
|
|
32
|
Configuration object: :class:`~IPython.config.loader.Config`
|
|
33
|
A configuration object is a simple dictionary-like class that holds
|
|
33
|
A configuration object is a simple dictionary-like class that holds
|
|
34
|
configuration attributes and sub-configuration objects. These classes
|
|
34
|
configuration attributes and sub-configuration objects. These classes
|
|
35
|
support dotted attribute style access (``Foo.bar``) in addition to the
|
|
35
|
support dotted attribute style access (``Foo.bar``) in addition to the
|
|
36
|
regular dictionary style access (``Foo['bar']``). Configuration objects
|
|
36
|
regular dictionary style access (``Foo['bar']``). Configuration objects
|
|
37
|
are smart. They know how to merge themselves with other configuration
|
|
37
|
are smart. They know how to merge themselves with other configuration
|
|
38
|
objects and they automatically create sub-configuration objects.
|
|
38
|
objects and they automatically create sub-configuration objects.
|
|
39
|
|
|
39
|
|
|
40
|
Application: :class:`~IPython.core.application.Application`
|
|
40
|
Application: :class:`~IPython.config.application.Application`
|
|
41
|
An application is a process that does a specific job. The most obvious
|
|
41
|
An application is a process that does a specific job. The most obvious
|
|
42
|
application is the :command:`ipython` command line program. Each
|
|
42
|
application is the :command:`ipython` command line program. Each
|
|
43
|
application reads a *single* configuration file and command line options
|
|
43
|
application reads *one or more* configuration files and a single set of
|
|
|
|
|
44
|
command line options
|
|
44
|
and then produces a master configuration object for the application. This
|
|
45
|
and then produces a master configuration object for the application. This
|
|
45
|
configuration object is then passed to the configurable objects that the
|
|
46
|
configuration object is then passed to the configurable objects that the
|
|
46
|
application creates. These configurable objects implement the actual logic
|
|
47
|
application creates. These configurable objects implement the actual logic
|
|
47
|
of the application and know how to configure themselves given the
|
|
48
|
of the application and know how to configure themselves given the
|
|
48
|
configuration object.
|
|
49
|
configuration object.
|
|
49
|
|
|
50
|
|
|
|
|
|
51
|
Applications always have a `log` attribute that is a configured Logger.
|
|
|
|
|
52
|
This allows centralized logging configuration per-application.
|
|
|
|
|
53
|
|
|
50
|
Component: :class:`~IPython.config.configurable.Configurable`
|
|
54
|
Component: :class:`~IPython.config.configurable.Configurable`
|
|
51
|
A configurable is a regular Python class that serves as a base class for
|
|
55
|
A configurable is a regular Python class that serves as a base class for
|
|
52
|
all main classes in an application. The
|
|
56
|
all main classes in an application. The
|
|
53
|
:class:`~IPython.config.configurable.Configurable` base class is
|
|
57
|
:class:`~IPython.config.configurable.Configurable` base class is
|
|
54
|
lightweight and only does one things.
|
|
58
|
lightweight and only does one things.
|
|
55
|
|
|
59
|
|
|
56
|
This :class:`~IPython.config.configurable.Configurable` is a subclass
|
|
60
|
This :class:`~IPython.config.configurable.Configurable` is a subclass
|
|
57
|
of :class:`~IPython.utils.traitlets.HasTraits` that knows how to configure
|
|
61
|
of :class:`~IPython.utils.traitlets.HasTraits` that knows how to configure
|
|
58
|
itself. Class level traits with the metadata ``config=True`` become
|
|
62
|
itself. Class level traits with the metadata ``config=True`` become
|
|
59
|
values that can be configured from the command line and configuration
|
|
63
|
values that can be configured from the command line and configuration
|
|
60
|
files.
|
|
64
|
files.
|
|
61
|
|
|
65
|
|
|
62
|
Developers create :class:`~IPython.config.configurable.Configurable`
|
|
66
|
Developers create :class:`~IPython.config.configurable.Configurable`
|
|
63
|
subclasses that implement all of the logic in the application. Each of
|
|
67
|
subclasses that implement all of the logic in the application. Each of
|
|
64
|
these subclasses has its own configuration information that controls how
|
|
68
|
these subclasses has its own configuration information that controls how
|
|
65
|
instances are created.
|
|
69
|
instances are created.
|
|
66
|
|
|
70
|
|
|
|
|
|
71
|
Singletons: :class:`~IPython.config.configurable.SingletonConfigurable`
|
|
|
|
|
72
|
Any object for which there is a single canonical instance. These are
|
|
|
|
|
73
|
just like Configurables, except they have a class method
|
|
|
|
|
74
|
:meth:`~IPython.config.configurable.SingletonConfigurable.instance`,
|
|
|
|
|
75
|
that returns the current active instance (or creates one if it
|
|
|
|
|
76
|
does not exist). Examples of singletons include
|
|
|
|
|
77
|
:class:`~IPython.config.application.Application`s and
|
|
|
|
|
78
|
:class:`~IPython.core.interactiveshell.InteractiveShell`. This lets
|
|
|
|
|
79
|
objects easily connect to the current running Application without passing
|
|
|
|
|
80
|
objects around everywhere. For instance, to get the current running
|
|
|
|
|
81
|
Application instance, simply do: ``app = Application.instance()``.
|
|
|
|
|
82
|
|
|
|
|
|
83
|
|
|
|
|
|
84
|
.. note::
|
|
|
|
|
85
|
|
|
|
|
|
86
|
Singletons are not strictly enforced - you can have many instances
|
|
|
|
|
87
|
of a given singleton class, but the :meth:`instance` method will always
|
|
|
|
|
88
|
return the same one.
|
|
|
|
|
89
|
|
|
67
|
Having described these main concepts, we can now state the main idea in our
|
|
90
|
Having described these main concepts, we can now state the main idea in our
|
|
68
|
configuration system: *"configuration" allows the default values of class
|
|
91
|
configuration system: *"configuration" allows the default values of class
|
|
69
|
attributes to be controlled on a class by class basis*. Thus all instances of
|
|
92
|
attributes to be controlled on a class by class basis*. Thus all instances of
|
|
70
|
a given class are configured in the same way. Furthermore, if two instances
|
|
93
|
a given class are configured in the same way. Furthermore, if two instances
|
|
71
|
need to be configured differently, they need to be instances of two different
|
|
94
|
need to be configured differently, they need to be instances of two different
|
|
72
|
classes. While this model may seem a bit restrictive, we have found that it
|
|
95
|
classes. While this model may seem a bit restrictive, we have found that it
|
|
73
|
expresses most things that need to be configured extremely well. However, it
|
|
96
|
expresses most things that need to be configured extremely well. However, it
|
|
74
|
is possible to create two instances of the same class that have different
|
|
97
|
is possible to create two instances of the same class that have different
|
|
75
|
trait values. This is done by overriding the configuration.
|
|
98
|
trait values. This is done by overriding the configuration.
|
|
76
|
|
|
99
|
|
|
77
|
Now, we show what our configuration objects and files look like.
|
|
100
|
Now, we show what our configuration objects and files look like.
|
|
78
|
|
|
101
|
|
|
79
|
Configuration objects and files
|
|
102
|
Configuration objects and files
|
|
80
|
===============================
|
|
103
|
===============================
|
|
81
|
|
|
104
|
|
|
82
|
A configuration file is simply a pure Python file that sets the attributes
|
|
105
|
A configuration file is simply a pure Python file that sets the attributes
|
|
83
|
of a global, pre-created configuration object. This configuration object is a
|
|
106
|
of a global, pre-created configuration object. This configuration object is a
|
|
84
|
:class:`~IPython.config.loader.Config` instance. While in a configuration
|
|
107
|
:class:`~IPython.config.loader.Config` instance. While in a configuration
|
|
85
|
file, to get a reference to this object, simply call the :func:`get_config`
|
|
108
|
file, to get a reference to this object, simply call the :func:`get_config`
|
|
86
|
function. We inject this function into the global namespace that the
|
|
109
|
function. We inject this function into the global namespace that the
|
|
87
|
configuration file is executed in.
|
|
110
|
configuration file is executed in.
|
|
88
|
|
|
111
|
|
|
89
|
Here is an example of a super simple configuration file that does nothing::
|
|
112
|
Here is an example of a super simple configuration file that does nothing::
|
|
90
|
|
|
113
|
|
|
91
|
c = get_config()
|
|
114
|
c = get_config()
|
|
92
|
|
|
115
|
|
|
93
|
Once you get a reference to the configuration object, you simply set
|
|
116
|
Once you get a reference to the configuration object, you simply set
|
|
94
|
attributes on it. All you have to know is:
|
|
117
|
attributes on it. All you have to know is:
|
|
95
|
|
|
118
|
|
|
96
|
* The name of each attribute.
|
|
119
|
* The name of each attribute.
|
|
97
|
* The type of each attribute.
|
|
120
|
* The type of each attribute.
|
|
98
|
|
|
121
|
|
|
99
|
The answers to these two questions are provided by the various
|
|
122
|
The answers to these two questions are provided by the various
|
|
100
|
:class:`~IPython.config.configurable.Configurable` subclasses that an
|
|
123
|
:class:`~IPython.config.configurable.Configurable` subclasses that an
|
|
101
|
application uses. Let's look at how this would work for a simple component
|
|
124
|
application uses. Let's look at how this would work for a simple component
|
|
102
|
subclass::
|
|
125
|
subclass::
|
|
103
|
|
|
126
|
|
|
104
|
# Sample component that can be configured.
|
|
127
|
# Sample component that can be configured.
|
|
105
|
from IPython.config.configurable import Configurable
|
|
128
|
from IPython.config.configurable import Configurable
|
|
106
|
from IPython.utils.traitlets import Int, Float, Str, Bool
|
|
129
|
from IPython.utils.traitlets import Int, Float, Str, Bool
|
|
107
|
|
|
130
|
|
|
108
|
class MyClass(Configurable):
|
|
131
|
class MyClass(Configurable):
|
|
109
|
name = Str('defaultname', config=True)
|
|
132
|
name = Unicode(u'defaultname', config=True)
|
|
110
|
ranking = Int(0, config=True)
|
|
133
|
ranking = Int(0, config=True)
|
|
111
|
value = Float(99.0)
|
|
134
|
value = Float(99.0)
|
|
112
|
# The rest of the class implementation would go here..
|
|
135
|
# The rest of the class implementation would go here..
|
|
113
|
|
|
136
|
|
|
114
|
In this example, we see that :class:`MyClass` has three attributes, two
|
|
137
|
In this example, we see that :class:`MyClass` has three attributes, two
|
|
115
|
of whom (``name``, ``ranking``) can be configured. All of the attributes
|
|
138
|
of whom (``name``, ``ranking``) can be configured. All of the attributes
|
|
116
|
are given types and default values. If a :class:`MyClass` is instantiated,
|
|
139
|
are given types and default values. If a :class:`MyClass` is instantiated,
|
|
117
|
but not configured, these default values will be used. But let's see how
|
|
140
|
but not configured, these default values will be used. But let's see how
|
|
118
|
to configure this class in a configuration file::
|
|
141
|
to configure this class in a configuration file::
|
|
119
|
|
|
142
|
|
|
120
|
# Sample config file
|
|
143
|
# Sample config file
|
|
121
|
c = get_config()
|
|
144
|
c = get_config()
|
|
122
|
|
|
145
|
|
|
123
|
c.MyClass.name = 'coolname'
|
|
146
|
c.MyClass.name = 'coolname'
|
|
124
|
c.MyClass.ranking = 10
|
|
147
|
c.MyClass.ranking = 10
|
|
125
|
|
|
148
|
|
|
126
|
After this configuration file is loaded, the values set in it will override
|
|
149
|
After this configuration file is loaded, the values set in it will override
|
|
127
|
the class defaults anytime a :class:`MyClass` is created. Furthermore,
|
|
150
|
the class defaults anytime a :class:`MyClass` is created. Furthermore,
|
|
128
|
these attributes will be type checked and validated anytime they are set.
|
|
151
|
these attributes will be type checked and validated anytime they are set.
|
|
129
|
This type checking is handled by the :mod:`IPython.utils.traitlets` module,
|
|
152
|
This type checking is handled by the :mod:`IPython.utils.traitlets` module,
|
|
130
|
which provides the :class:`Str`, :class:`Int` and :class:`Float` types. In
|
|
153
|
which provides the :class:`Str`, :class:`Int` and :class:`Float` types. In
|
|
131
|
addition to these traitlets, the :mod:`IPython.utils.traitlets` provides
|
|
154
|
addition to these traitlets, the :mod:`IPython.utils.traitlets` provides
|
|
132
|
traitlets for a number of other types.
|
|
155
|
traitlets for a number of other types.
|
|
133
|
|
|
156
|
|
|
134
|
.. note::
|
|
157
|
.. note::
|
|
135
|
|
|
158
|
|
|
136
|
Underneath the hood, the :class:`Configurable` base class is a subclass of
|
|
159
|
Underneath the hood, the :class:`Configurable` base class is a subclass of
|
|
137
|
:class:`IPython.utils.traitlets.HasTraits`. The
|
|
160
|
:class:`IPython.utils.traitlets.HasTraits`. The
|
|
138
|
:mod:`IPython.utils.traitlets` module is a lightweight version of
|
|
161
|
:mod:`IPython.utils.traitlets` module is a lightweight version of
|
|
139
|
:mod:`enthought.traits`. Our implementation is a pure Python subset
|
|
162
|
:mod:`enthought.traits`. Our implementation is a pure Python subset
|
|
140
|
(mostly API compatible) of :mod:`enthought.traits` that does not have any
|
|
163
|
(mostly API compatible) of :mod:`enthought.traits` that does not have any
|
|
141
|
of the automatic GUI generation capabilities. Our plan is to achieve 100%
|
|
164
|
of the automatic GUI generation capabilities. Our plan is to achieve 100%
|
|
142
|
API compatibility to enable the actual :mod:`enthought.traits` to
|
|
165
|
API compatibility to enable the actual :mod:`enthought.traits` to
|
|
143
|
eventually be used instead. Currently, we cannot use
|
|
166
|
eventually be used instead. Currently, we cannot use
|
|
144
|
:mod:`enthought.traits` as we are committed to the core of IPython being
|
|
167
|
:mod:`enthought.traits` as we are committed to the core of IPython being
|
|
145
|
pure Python.
|
|
168
|
pure Python.
|
|
146
|
|
|
169
|
|
|
147
|
It should be very clear at this point what the naming convention is for
|
|
170
|
It should be very clear at this point what the naming convention is for
|
|
148
|
configuration attributes::
|
|
171
|
configuration attributes::
|
|
149
|
|
|
172
|
|
|
150
|
c.ClassName.attribute_name = attribute_value
|
|
173
|
c.ClassName.attribute_name = attribute_value
|
|
151
|
|
|
174
|
|
|
152
|
Here, ``ClassName`` is the name of the class whose configuration attribute you
|
|
175
|
Here, ``ClassName`` is the name of the class whose configuration attribute you
|
|
153
|
want to set, ``attribute_name`` is the name of the attribute you want to set
|
|
176
|
want to set, ``attribute_name`` is the name of the attribute you want to set
|
|
154
|
and ``attribute_value`` the the value you want it to have. The ``ClassName``
|
|
177
|
and ``attribute_value`` the the value you want it to have. The ``ClassName``
|
|
155
|
attribute of ``c`` is not the actual class, but instead is another
|
|
178
|
attribute of ``c`` is not the actual class, but instead is another
|
|
156
|
:class:`~IPython.config.loader.Config` instance.
|
|
179
|
:class:`~IPython.config.loader.Config` instance.
|
|
157
|
|
|
180
|
|
|
158
|
.. note::
|
|
181
|
.. note::
|
|
159
|
|
|
182
|
|
|
160
|
The careful reader may wonder how the ``ClassName`` (``MyClass`` in
|
|
183
|
The careful reader may wonder how the ``ClassName`` (``MyClass`` in
|
|
161
|
the above example) attribute of the configuration object ``c`` gets
|
|
184
|
the above example) attribute of the configuration object ``c`` gets
|
|
162
|
created. These attributes are created on the fly by the
|
|
185
|
created. These attributes are created on the fly by the
|
|
163
|
:class:`~IPython.config.loader.Config` instance, using a simple naming
|
|
186
|
:class:`~IPython.config.loader.Config` instance, using a simple naming
|
|
164
|
convention. Any attribute of a :class:`~IPython.config.loader.Config`
|
|
187
|
convention. Any attribute of a :class:`~IPython.config.loader.Config`
|
|
165
|
instance whose name begins with an uppercase character is assumed to be a
|
|
188
|
instance whose name begins with an uppercase character is assumed to be a
|
|
166
|
sub-configuration and a new empty :class:`~IPython.config.loader.Config`
|
|
189
|
sub-configuration and a new empty :class:`~IPython.config.loader.Config`
|
|
167
|
instance is dynamically created for that attribute. This allows deeply
|
|
190
|
instance is dynamically created for that attribute. This allows deeply
|
|
168
|
hierarchical information created easily (``c.Foo.Bar.value``) on the fly.
|
|
191
|
hierarchical information created easily (``c.Foo.Bar.value``) on the fly.
|
|
169
|
|
|
192
|
|
|
170
|
Configuration files inheritance
|
|
193
|
Configuration files inheritance
|
|
171
|
===============================
|
|
194
|
===============================
|
|
172
|
|
|
195
|
|
|
173
|
Let's say you want to have different configuration files for various purposes.
|
|
196
|
Let's say you want to have different configuration files for various purposes.
|
|
174
|
Our configuration system makes it easy for one configuration file to inherit
|
|
197
|
Our configuration system makes it easy for one configuration file to inherit
|
|
175
|
the information in another configuration file. The :func:`load_subconfig`
|
|
198
|
the information in another configuration file. The :func:`load_subconfig`
|
|
176
|
command can be used in a configuration file for this purpose. Here is a simple
|
|
199
|
command can be used in a configuration file for this purpose. Here is a simple
|
|
177
|
example that loads all of the values from the file :file:`base_config.py`::
|
|
200
|
example that loads all of the values from the file :file:`base_config.py`::
|
|
178
|
|
|
201
|
|
|
179
|
# base_config.py
|
|
202
|
# base_config.py
|
|
180
|
c = get_config()
|
|
203
|
c = get_config()
|
|
181
|
c.MyClass.name = 'coolname'
|
|
204
|
c.MyClass.name = 'coolname'
|
|
182
|
c.MyClass.ranking = 100
|
|
205
|
c.MyClass.ranking = 100
|
|
183
|
|
|
206
|
|
|
184
|
into the configuration file :file:`main_config.py`::
|
|
207
|
into the configuration file :file:`main_config.py`::
|
|
185
|
|
|
208
|
|
|
186
|
# main_config.py
|
|
209
|
# main_config.py
|
|
187
|
c = get_config()
|
|
210
|
c = get_config()
|
|
188
|
|
|
211
|
|
|
189
|
# Load everything from base_config.py
|
|
212
|
# Load everything from base_config.py
|
|
190
|
load_subconfig('base_config.py')
|
|
213
|
load_subconfig('base_config.py')
|
|
191
|
|
|
214
|
|
|
192
|
# Now override one of the values
|
|
215
|
# Now override one of the values
|
|
193
|
c.MyClass.name = 'bettername'
|
|
216
|
c.MyClass.name = 'bettername'
|
|
194
|
|
|
217
|
|
|
195
|
In a situation like this the :func:`load_subconfig` makes sure that the
|
|
218
|
In a situation like this the :func:`load_subconfig` makes sure that the
|
|
196
|
search path for sub-configuration files is inherited from that of the parent.
|
|
219
|
search path for sub-configuration files is inherited from that of the parent.
|
|
197
|
Thus, you can typically put the two in the same directory and everything will
|
|
220
|
Thus, you can typically put the two in the same directory and everything will
|
|
198
|
just work.
|
|
221
|
just work.
|
|
199
|
|
|
222
|
|
|
|
|
|
223
|
You can also load configuration files by profile, for instance:
|
|
|
|
|
224
|
|
|
|
|
|
225
|
.. sourcecode:: python
|
|
|
|
|
226
|
|
|
|
|
|
227
|
load_subconfig('ipython_config.py', profile='default')
|
|
|
|
|
228
|
|
|
|
|
|
229
|
to inherit your default configuration as a starting point.
|
|
|
|
|
230
|
|
|
|
|
|
231
|
|
|
200
|
Class based configuration inheritance
|
|
232
|
Class based configuration inheritance
|
|
201
|
=====================================
|
|
233
|
=====================================
|
|
202
|
|
|
234
|
|
|
203
|
There is another aspect of configuration where inheritance comes into play.
|
|
235
|
There is another aspect of configuration where inheritance comes into play.
|
|
204
|
Sometimes, your classes will have an inheritance hierarchy that you want
|
|
236
|
Sometimes, your classes will have an inheritance hierarchy that you want
|
|
205
|
to be reflected in the configuration system. Here is a simple example::
|
|
237
|
to be reflected in the configuration system. Here is a simple example::
|
|
206
|
|
|
238
|
|
|
207
|
from IPython.config.configurable import Configurable
|
|
239
|
from IPython.config.configurable import Configurable
|
|
208
|
from IPython.utils.traitlets import Int, Float, Str, Bool
|
|
240
|
from IPython.utils.traitlets import Int, Float, Str, Bool
|
|
209
|
|
|
241
|
|
|
210
|
class Foo(Configurable):
|
|
242
|
class Foo(Configurable):
|
|
211
|
name = Str('fooname', config=True)
|
|
243
|
name = Str('fooname', config=True)
|
|
212
|
value = Float(100.0, config=True)
|
|
244
|
value = Float(100.0, config=True)
|
|
213
|
|
|
245
|
|
|
214
|
class Bar(Foo):
|
|
246
|
class Bar(Foo):
|
|
215
|
name = Str('barname', config=True)
|
|
247
|
name = Str('barname', config=True)
|
|
216
|
othervalue = Int(0, config=True)
|
|
248
|
othervalue = Int(0, config=True)
|
|
217
|
|
|
249
|
|
|
218
|
Now, we can create a configuration file to configure instances of :class:`Foo`
|
|
250
|
Now, we can create a configuration file to configure instances of :class:`Foo`
|
|
219
|
and :class:`Bar`::
|
|
251
|
and :class:`Bar`::
|
|
220
|
|
|
252
|
|
|
221
|
# config file
|
|
253
|
# config file
|
|
222
|
c = get_config()
|
|
254
|
c = get_config()
|
|
223
|
|
|
255
|
|
|
224
|
c.Foo.name = 'bestname'
|
|
256
|
c.Foo.name = 'bestname'
|
|
225
|
c.Bar.othervalue = 10
|
|
257
|
c.Bar.othervalue = 10
|
|
226
|
|
|
258
|
|
|
227
|
This class hierarchy and configuration file accomplishes the following:
|
|
259
|
This class hierarchy and configuration file accomplishes the following:
|
|
228
|
|
|
260
|
|
|
229
|
* The default value for :attr:`Foo.name` and :attr:`Bar.name` will be
|
|
261
|
* The default value for :attr:`Foo.name` and :attr:`Bar.name` will be
|
|
230
|
'bestname'. Because :class:`Bar` is a :class:`Foo` subclass it also
|
|
262
|
'bestname'. Because :class:`Bar` is a :class:`Foo` subclass it also
|
|
231
|
picks up the configuration information for :class:`Foo`.
|
|
263
|
picks up the configuration information for :class:`Foo`.
|
|
232
|
* The default value for :attr:`Foo.value` and :attr:`Bar.value` will be
|
|
264
|
* The default value for :attr:`Foo.value` and :attr:`Bar.value` will be
|
|
233
|
``100.0``, which is the value specified as the class default.
|
|
265
|
``100.0``, which is the value specified as the class default.
|
|
234
|
* The default value for :attr:`Bar.othervalue` will be 10 as set in the
|
|
266
|
* The default value for :attr:`Bar.othervalue` will be 10 as set in the
|
|
235
|
configuration file. Because :class:`Foo` is the parent of :class:`Bar`
|
|
267
|
configuration file. Because :class:`Foo` is the parent of :class:`Bar`
|
|
236
|
it doesn't know anything about the :attr:`othervalue` attribute.
|
|
268
|
it doesn't know anything about the :attr:`othervalue` attribute.
|
|
237
|
|
|
269
|
|
|
238
|
|
|
270
|
|
|
239
|
.. _ipython_dir:
|
|
271
|
.. _ipython_dir:
|
|
240
|
|
|
272
|
|
|
241
|
Configuration file location
|
|
273
|
Configuration file location
|
|
242
|
===========================
|
|
274
|
===========================
|
|
243
|
|
|
275
|
|
|
244
|
So where should you put your configuration files? By default, all IPython
|
|
276
|
So where should you put your configuration files? IPython uses "profiles" for
|
|
245
|
applications look in the so called "IPython directory". The location of
|
|
277
|
configuration, and by default, all profiles will be stored in the so called
|
|
246
|
this directory is determined by the following algorithm:
|
|
278
|
"IPython directory". The location of this directory is determined by the
|
|
|
|
|
279
|
following algorithm:
|
|
247
|
|
|
280
|
|
|
248
|
* If the ``ipython_dir`` command line flag is given, its value is used.
|
|
281
|
* If the ``ipython_dir`` command line flag is given, its value is used.
|
|
249
|
|
|
282
|
|
|
250
|
* If not, the value returned by :func:`IPython.utils.path.get_ipython_dir`
|
|
283
|
* If not, the value returned by :func:`IPython.utils.path.get_ipython_dir`
|
|
251
|
is used. This function will first look at the :envvar:`IPYTHON_DIR`
|
|
284
|
is used. This function will first look at the :envvar:`IPYTHON_DIR`
|
|
252
|
environment variable and then default to a platform-specific default.
|
|
285
|
environment variable and then default to a platform-specific default.
|
|
253
|
|
|
286
|
|
|
254
|
On posix systems (Linux, Unix, etc.), IPython respects the ``$XDG_CONFIG_HOME``
|
|
287
|
On posix systems (Linux, Unix, etc.), IPython respects the ``$XDG_CONFIG_HOME``
|
|
255
|
part of the `XDG Base Directory`_ specification. If ``$XDG_CONFIG_HOME`` is
|
|
288
|
part of the `XDG Base Directory`_ specification. If ``$XDG_CONFIG_HOME`` is
|
|
256
|
defined and exists ( ``XDG_CONFIG_HOME`` has a default interpretation of
|
|
289
|
defined and exists ( ``XDG_CONFIG_HOME`` has a default interpretation of
|
|
257
|
:file:`$HOME/.config`), then IPython's config directory will be located in
|
|
290
|
:file:`$HOME/.config`), then IPython's config directory will be located in
|
|
258
|
:file:`$XDG_CONFIG_HOME/ipython`. If users still have an IPython directory
|
|
291
|
:file:`$XDG_CONFIG_HOME/ipython`. If users still have an IPython directory
|
|
259
|
in :file:`$HOME/.ipython`, then that will be used. in preference to the
|
|
292
|
in :file:`$HOME/.ipython`, then that will be used. in preference to the
|
|
260
|
system default.
|
|
293
|
system default.
|
|
261
|
|
|
294
|
|
|
262
|
For most users, the default value will simply be something like
|
|
295
|
For most users, the default value will simply be something like
|
|
263
|
:file:`$HOME/.config/ipython` on Linux, or :file:`$HOME/.ipython`
|
|
296
|
:file:`$HOME/.config/ipython` on Linux, or :file:`$HOME/.ipython`
|
|
264
|
elsewhere.
|
|
297
|
elsewhere.
|
|
265
|
|
|
298
|
|
|
266
|
Once the location of the IPython directory has been determined, you need to
|
|
299
|
Once the location of the IPython directory has been determined, you need to know
|
|
267
|
know what filename to use for the configuration file. The basic idea is that
|
|
300
|
which profile you are using. For users with a single configuration, this will
|
|
268
|
each application has its own default configuration filename. The default named
|
|
301
|
simply be 'default', and will be located in
|
|
269
|
used by the :command:`ipython` command line program is
|
|
302
|
:file:`<IPYTHON_DIR>/profile_default`.
|
|
270
|
:file:`ipython_config.py`. This value can be overriden by the ``config_file``
|
|
303
|
|
|
271
|
command line flag. A sample :file:`ipython_config.py` file can be found
|
|
304
|
The next thing you need to know is what to call your configuration file. The
|
|
272
|
in :mod:`IPython.config.default.ipython_config.py`. Simple copy it to your
|
|
305
|
basic idea is that each application has its own default configuration filename.
|
|
273
|
IPython directory to begin using it.
|
|
306
|
The default named used by the :command:`ipython` command line program is
|
|
|
|
|
307
|
:file:`ipython_config.py`, and *all* IPython applications will use this file.
|
|
|
|
|
308
|
Other applications, such as the parallel :command:`ipcluster` scripts or the
|
|
|
|
|
309
|
QtConsole will load their own config files *after* :file:`ipython_config.py`. To
|
|
|
|
|
310
|
load a particular configuration file instead of the default, the name can be
|
|
|
|
|
311
|
overridden by the ``config_file`` command line flag.
|
|
|
|
|
312
|
|
|
|
|
|
313
|
To generate the default configuration files, do::
|
|
|
|
|
314
|
|
|
|
|
|
315
|
$> ipython profile create
|
|
|
|
|
316
|
|
|
|
|
|
317
|
and you will have a default :file:`ipython_config.py` in your IPython directory
|
|
|
|
|
318
|
under :file:`profile_default`. If you want the default config files for the
|
|
|
|
|
319
|
:mod:`IPython.parallel` applications, add ``--parallel`` to the end of the
|
|
|
|
|
320
|
command-line args.
|
|
274
|
|
|
321
|
|
|
275
|
.. _Profiles:
|
|
322
|
.. _Profiles:
|
|
276
|
|
|
323
|
|
|
277
|
Profiles
|
|
324
|
Profiles
|
|
278
|
========
|
|
325
|
========
|
|
279
|
|
|
326
|
|
|
280
|
A profile is simply a configuration file that follows a simple naming
|
|
327
|
A profile is a directory containing configuration and runtime files, such as
|
|
281
|
convention and can be loaded using a simplified syntax. The idea is
|
|
328
|
logs, connection info for the parallel apps, and your IPython command history.
|
|
282
|
that users often want to maintain a set of configuration files for different
|
|
329
|
|
|
283
|
purposes: one for doing numerical computing with NumPy and SciPy and
|
|
330
|
The idea is that users often want to maintain a set of configuration files for
|
|
284
|
another for doing symbolic computing with SymPy. Profiles make it easy
|
|
331
|
different purposes: one for doing numerical computing with NumPy and SciPy and
|
|
285
|
to keep a separate configuration file for each of these purposes.
|
|
332
|
another for doing symbolic computing with SymPy. Profiles make it easy to keep a
|
|
|
|
|
333
|
separate configuration files, logs, and histories for each of these purposes.
|
|
286
|
|
|
334
|
|
|
287
|
Let's start by showing how a profile is used:
|
|
335
|
Let's start by showing how a profile is used:
|
|
288
|
|
|
336
|
|
|
289
|
.. code-block:: bash
|
|
337
|
.. code-block:: bash
|
|
290
|
|
|
338
|
|
|
291
|
$ ipython profile=sympy
|
|
339
|
$ ipython profile=sympy
|
|
292
|
|
|
340
|
|
|
293
|
This tells the :command:`ipython` command line program to get its
|
|
341
|
This tells the :command:`ipython` command line program to get its configuration
|
|
294
|
configuration from the "sympy" profile. The search path for profiles is the
|
|
342
|
from the "sympy" profile. The file names for various profiles do not change. The
|
|
295
|
same as that of regular configuration files. The only difference is that
|
|
343
|
only difference is that profiles are named in a special way. In the case above,
|
|
296
|
profiles are named in a special way. In the case above, the "sympy" profile
|
|
344
|
the "sympy" profile means looking for :file:`ipython_config.py` in :file:`<IPYTHON_DIR>/profile_sympy`.
|
|
297
|
would need to have the name :file:`ipython_config_sympy.py`.
|
|
345
|
|
|
|
|
|
346
|
The general pattern is this: simply create a new profile with:
|
|
|
|
|
347
|
|
|
|
|
|
348
|
.. code-block:: bash
|
|
|
|
|
349
|
|
|
|
|
|
350
|
ipython profile create <name>
|
|
|
|
|
351
|
|
|
|
|
|
352
|
which adds a directory called ``profile_<name>`` to your IPython directory. Then
|
|
|
|
|
353
|
you can load this profile by adding ``profile=<name>`` to your command line
|
|
|
|
|
354
|
options. Profiles are supported by all IPython applications.
|
|
|
|
|
355
|
|
|
|
|
|
356
|
IPython ships with some sample profiles in :file:`IPython/config/profile`. If
|
|
|
|
|
357
|
you create profiles with the name of one of our shipped profiles, these config
|
|
|
|
|
358
|
files will be copied over instead of starting with the automatically generated
|
|
|
|
|
359
|
config files.
|
|
|
|
|
360
|
|
|
|
|
|
361
|
.. _commandline:
|
|
|
|
|
362
|
|
|
|
|
|
363
|
Command-line arguments
|
|
|
|
|
364
|
======================
|
|
|
|
|
365
|
|
|
|
|
|
366
|
IPython exposes *all* configurable options on the command-line. The command-line
|
|
|
|
|
367
|
arguments are generated from the Configurable traits of the classes associated
|
|
|
|
|
368
|
with a given Application. Configuring IPython from the command-line may look
|
|
|
|
|
369
|
very similar to an IPython config file
|
|
|
|
|
370
|
|
|
|
|
|
371
|
IPython applications use a parser called
|
|
|
|
|
372
|
:class:`~IPython.config.loader.KeyValueLoader` to load values into a Config
|
|
|
|
|
373
|
object. Values are assigned in much the same way as in a config file:
|
|
|
|
|
374
|
|
|
|
|
|
375
|
.. code-block:: bash
|
|
|
|
|
376
|
|
|
|
|
|
377
|
$> ipython InteractiveShell.use_readline=False BaseIPythonApplication.profile='myprofile'
|
|
|
|
|
378
|
|
|
|
|
|
379
|
Is the same as adding:
|
|
|
|
|
380
|
|
|
|
|
|
381
|
.. sourcecode:: python
|
|
|
|
|
382
|
|
|
|
|
|
383
|
c.InteractiveShell.use_readline=False
|
|
|
|
|
384
|
c.BaseIPythonApplication.profile='myprofile'
|
|
|
|
|
385
|
|
|
|
|
|
386
|
to your config file. Key/Value arguments *always* take a value, separated by '='
|
|
|
|
|
387
|
and no spaces.
|
|
|
|
|
388
|
|
|
|
|
|
389
|
Aliases
|
|
|
|
|
390
|
-------
|
|
|
|
|
391
|
|
|
|
|
|
392
|
For convenience, applications have a mapping of commonly
|
|
|
|
|
393
|
used traits, so you don't have to specify the whole class name. For these **aliases**, the class need not be specified:
|
|
|
|
|
394
|
|
|
|
|
|
395
|
.. code-block:: bash
|
|
|
|
|
396
|
|
|
|
|
|
397
|
$> ipython profile='myprofile'
|
|
|
|
|
398
|
# is equivalent to
|
|
|
|
|
399
|
$> ipython BaseIPythonApplication.profile='myprofile'
|
|
|
|
|
400
|
|
|
|
|
|
401
|
Flags
|
|
|
|
|
402
|
-----
|
|
|
|
|
403
|
|
|
|
|
|
404
|
Applications can also be passed **flags**. Flags are options that take no
|
|
|
|
|
405
|
arguments, and are always prefixed with ``--``. They are simply wrappers for
|
|
|
|
|
406
|
setting one or more configurables with predefined values, often True/False.
|
|
|
|
|
407
|
|
|
|
|
|
408
|
For instance:
|
|
|
|
|
409
|
|
|
|
|
|
410
|
.. code-block:: bash
|
|
|
|
|
411
|
|
|
|
|
|
412
|
$> ipcontroller --debug
|
|
|
|
|
413
|
# is equivalent to
|
|
|
|
|
414
|
$> ipcontroller Application.log_level=DEBUG
|
|
|
|
|
415
|
# and
|
|
|
|
|
416
|
$> ipython --pylab
|
|
|
|
|
417
|
# is equivalent to
|
|
|
|
|
418
|
$> ipython pylab=auto
|
|
|
|
|
419
|
|
|
|
|
|
420
|
Subcommands
|
|
|
|
|
421
|
-----------
|
|
|
|
|
422
|
|
|
|
|
|
423
|
|
|
|
|
|
424
|
Some IPython applications have **subcommands**. Subcommands are modeled after
|
|
|
|
|
425
|
:command:`git`, and are called with the form :command:`command subcommand
|
|
|
|
|
426
|
[...args]`. Currently, the QtConsole is a subcommand of terminal IPython:
|
|
|
|
|
427
|
|
|
|
|
|
428
|
.. code-block:: bash
|
|
|
|
|
429
|
|
|
|
|
|
430
|
$> ipython qtconsole profile=myprofile
|
|
|
|
|
431
|
|
|
|
|
|
432
|
and :command:`ipcluster` is simply a wrapper for its various subcommands (start,
|
|
|
|
|
433
|
stop, engines).
|
|
|
|
|
434
|
|
|
|
|
|
435
|
.. code-block:: bash
|
|
|
|
|
436
|
|
|
|
|
|
437
|
$> ipcluster start profile=myprofile n=4
|
|
|
|
|
438
|
|
|
298
|
|
|
439
|
|
|
299
|
The general pattern is this: simply add ``<profilename>`` to the end of the
|
|
440
|
To see a list of the available aliases, flags, and subcommands for an IPython application, simply pass ``-h`` or ``--help``. And to see the full list of configurable options (*very* long), pass ``--help-all``.
|
|
300
|
normal configuration file name. Then load the profile by adding
|
|
|
|
|
301
|
``profile=<profilename>`` to your command line options.
|
|
|
|
|
302
|
|
|
441
|
|
|
303
|
IPython ships with some sample profiles in :mod:`IPython.config.profile`.
|
|
|
|
|
304
|
Simply copy these to your IPython directory to begin using them.
|
|
|
|
|
305
|
|
|
442
|
|
|
306
|
Design requirements
|
|
443
|
Design requirements
|
|
307
|
===================
|
|
444
|
===================
|
|
308
|
|
|
445
|
|
|
309
|
Here are the main requirements we wanted our configuration system to have:
|
|
446
|
Here are the main requirements we wanted our configuration system to have:
|
|
310
|
|
|
447
|
|
|
311
|
* Support for hierarchical configuration information.
|
|
448
|
* Support for hierarchical configuration information.
|
|
312
|
|
|
449
|
|
|
313
|
* Full integration with command line option parsers. Often, you want to read
|
|
450
|
* Full integration with command line option parsers. Often, you want to read
|
|
314
|
a configuration file, but then override some of the values with command line
|
|
451
|
a configuration file, but then override some of the values with command line
|
|
315
|
options. Our configuration system automates this process and allows each
|
|
452
|
options. Our configuration system automates this process and allows each
|
|
316
|
command line option to be linked to a particular attribute in the
|
|
453
|
command line option to be linked to a particular attribute in the
|
|
317
|
configuration hierarchy that it will override.
|
|
454
|
configuration hierarchy that it will override.
|
|
318
|
|
|
455
|
|
|
319
|
* Configuration files that are themselves valid Python code. This accomplishes
|
|
456
|
* Configuration files that are themselves valid Python code. This accomplishes
|
|
320
|
many things. First, it becomes possible to put logic in your configuration
|
|
457
|
many things. First, it becomes possible to put logic in your configuration
|
|
321
|
files that sets attributes based on your operating system, network setup,
|
|
458
|
files that sets attributes based on your operating system, network setup,
|
|
322
|
Python version, etc. Second, Python has a super simple syntax for accessing
|
|
459
|
Python version, etc. Second, Python has a super simple syntax for accessing
|
|
323
|
hierarchical data structures, namely regular attribute access
|
|
460
|
hierarchical data structures, namely regular attribute access
|
|
324
|
(``Foo.Bar.Bam.name``). Third, using Python makes it easy for users to
|
|
461
|
(``Foo.Bar.Bam.name``). Third, using Python makes it easy for users to
|
|
325
|
import configuration attributes from one configuration file to another.
|
|
462
|
import configuration attributes from one configuration file to another.
|
|
326
|
Forth, even though Python is dynamically typed, it does have types that can
|
|
463
|
Forth, even though Python is dynamically typed, it does have types that can
|
|
327
|
be checked at runtime. Thus, a ``1`` in a config file is the integer '1',
|
|
464
|
be checked at runtime. Thus, a ``1`` in a config file is the integer '1',
|
|
328
|
while a ``'1'`` is a string.
|
|
465
|
while a ``'1'`` is a string.
|
|
329
|
|
|
466
|
|
|
330
|
* A fully automated method for getting the configuration information to the
|
|
467
|
* A fully automated method for getting the configuration information to the
|
|
331
|
classes that need it at runtime. Writing code that walks a configuration
|
|
468
|
classes that need it at runtime. Writing code that walks a configuration
|
|
332
|
hierarchy to extract a particular attribute is painful. When you have
|
|
469
|
hierarchy to extract a particular attribute is painful. When you have
|
|
333
|
complex configuration information with hundreds of attributes, this makes
|
|
470
|
complex configuration information with hundreds of attributes, this makes
|
|
334
|
you want to cry.
|
|
471
|
you want to cry.
|
|
335
|
|
|
472
|
|
|
336
|
* Type checking and validation that doesn't require the entire configuration
|
|
473
|
* Type checking and validation that doesn't require the entire configuration
|
|
337
|
hierarchy to be specified statically before runtime. Python is a very
|
|
474
|
hierarchy to be specified statically before runtime. Python is a very
|
|
338
|
dynamic language and you don't always know everything that needs to be
|
|
475
|
dynamic language and you don't always know everything that needs to be
|
|
339
|
configured when a program starts.
|
|
476
|
configured when a program starts.
|
|
340
|
|
|
477
|
|
|
341
|
|
|
478
|
|
|
342
|
.. _`XDG Base Directory`: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|
|
479
|
.. _`XDG Base Directory`: http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html
|