Show More
@@ -0,0 +1,174 b'' | |||||
|
1 | # encoding: utf-8 | |||
|
2 | """ | |||
|
3 | An application for managing IPython profiles. | |||
|
4 | ||||
|
5 | To be invoked as the `ipython profile` subcommand. | |||
|
6 | ||||
|
7 | Authors: | |||
|
8 | ||||
|
9 | * Min RK | |||
|
10 | ||||
|
11 | """ | |||
|
12 | ||||
|
13 | #----------------------------------------------------------------------------- | |||
|
14 | # Copyright (C) 2008-2011 The IPython Development Team | |||
|
15 | # | |||
|
16 | # Distributed under the terms of the BSD License. The full license is in | |||
|
17 | # the file COPYING, distributed as part of this software. | |||
|
18 | #----------------------------------------------------------------------------- | |||
|
19 | ||||
|
20 | #----------------------------------------------------------------------------- | |||
|
21 | # Imports | |||
|
22 | #----------------------------------------------------------------------------- | |||
|
23 | ||||
|
24 | import logging | |||
|
25 | import os | |||
|
26 | ||||
|
27 | from IPython.config.application import Application, boolean_flag | |||
|
28 | from IPython.core.application import ( | |||
|
29 | BaseIPythonApplication, base_flags, base_aliases | |||
|
30 | ) | |||
|
31 | from IPython.core.profiledir import ProfileDir | |||
|
32 | from IPython.utils.path import get_ipython_dir | |||
|
33 | from IPython.utils.traitlets import Unicode, Bool, Dict | |||
|
34 | ||||
|
35 | #----------------------------------------------------------------------------- | |||
|
36 | # Constants | |||
|
37 | #----------------------------------------------------------------------------- | |||
|
38 | ||||
|
39 | create_help = """Create an ipcluster profile by name | |||
|
40 | ||||
|
41 | Create an ipython profile directory by its name or | |||
|
42 | profile directory path. Profile directories contain | |||
|
43 | configuration, log and security related files and are named | |||
|
44 | using the convention 'profile_<name>'. By default they are | |||
|
45 | located in your ipython directory. Once created, you will | |||
|
46 | can edit the configuration files in the profile | |||
|
47 | directory to configure IPython. Most users will create a | |||
|
48 | cluster directory by profile name, | |||
|
49 | `ipython profile create myprofile`, which will put the directory | |||
|
50 | in `<ipython_dir>/profile_myprofile`. | |||
|
51 | """ | |||
|
52 | list_help = """List available IPython profiles | |||
|
53 | ||||
|
54 | List all available profiles, by profile location, that can | |||
|
55 | be found in the current working directly or in the ipython | |||
|
56 | directory. Profile directories are named using the convention | |||
|
57 | 'profile_<profile>'. | |||
|
58 | """ | |||
|
59 | profile_help = """Manage IPython profiles | |||
|
60 | ||||
|
61 | Profile directories contain | |||
|
62 | configuration, log and security related files and are named | |||
|
63 | using the convention 'profile_<name>'. By default they are | |||
|
64 | located in your ipython directory. You can create profiles | |||
|
65 | with `ipython profile create <name>`, or see the profiles you | |||
|
66 | already have with `ipython profile list` | |||
|
67 | ||||
|
68 | To get started configuring IPython, simply do: | |||
|
69 | ||||
|
70 | $> ipython profile create | |||
|
71 | ||||
|
72 | and IPython will create the default profile in <ipython_dir>/profile_default, | |||
|
73 | where you can edit ipython_config.py to start configuring IPython. | |||
|
74 | ||||
|
75 | """ | |||
|
76 | ||||
|
77 | #----------------------------------------------------------------------------- | |||
|
78 | # Profile Application Class (for `ipython profile` subcommand) | |||
|
79 | #----------------------------------------------------------------------------- | |||
|
80 | ||||
|
81 | ||||
|
82 | ||||
|
83 | class ProfileList(Application): | |||
|
84 | name = u'ipython-profile' | |||
|
85 | description = list_help | |||
|
86 | ||||
|
87 | aliases = Dict(dict( | |||
|
88 | ipython_dir = 'ProfileList.ipython_dir', | |||
|
89 | log_level = 'Application.log_level', | |||
|
90 | )) | |||
|
91 | flags = Dict(dict( | |||
|
92 | debug = ({'Application' : {'log_level' : 0}}, | |||
|
93 | "Set log_level to 0, maximizing log output." | |||
|
94 | ) | |||
|
95 | )) | |||
|
96 | ipython_dir = Unicode(get_ipython_dir(), config=True, | |||
|
97 | help=""" | |||
|
98 | The name of the IPython directory. This directory is used for logging | |||
|
99 | configuration (through profiles), history storage, etc. The default | |||
|
100 | is usually $HOME/.ipython. This options can also be specified through | |||
|
101 | the environment variable IPYTHON_DIR. | |||
|
102 | """ | |||
|
103 | ) | |||
|
104 | ||||
|
105 | def list_profile_dirs(self): | |||
|
106 | # Find the search paths | |||
|
107 | paths = [os.getcwdu(), self.ipython_dir] | |||
|
108 | ||||
|
109 | self.log.warn('Searching for IPython profiles in paths: %r' % paths) | |||
|
110 | for path in paths: | |||
|
111 | files = os.listdir(path) | |||
|
112 | for f in files: | |||
|
113 | full_path = os.path.join(path, f) | |||
|
114 | if os.path.isdir(full_path) and f.startswith('profile_'): | |||
|
115 | profile = f.split('_',1)[-1] | |||
|
116 | start_cmd = 'ipython profile=%s' % profile | |||
|
117 | print start_cmd + " ==> " + full_path | |||
|
118 | ||||
|
119 | def start(self): | |||
|
120 | self.list_profile_dirs() | |||
|
121 | ||||
|
122 | ||||
|
123 | create_flags = {} | |||
|
124 | create_flags.update(base_flags) | |||
|
125 | create_flags.update(boolean_flag('reset', 'ProfileCreate.overwrite', | |||
|
126 | "reset config files to defaults", "leave existing config files")) | |||
|
127 | create_flags.update(boolean_flag('cluster', 'ProfileCreate.cluster', | |||
|
128 | "Include parallel computing config files", | |||
|
129 | "Don't include parallel computing config files")) | |||
|
130 | ||||
|
131 | class ProfileCreate(BaseIPythonApplication): | |||
|
132 | name = u'ipython-profile' | |||
|
133 | description = create_help | |||
|
134 | auto_create = Bool(True, config=False) | |||
|
135 | ||||
|
136 | def _copy_config_files_default(self): | |||
|
137 | return True | |||
|
138 | ||||
|
139 | cluster = Bool(False, config=True, | |||
|
140 | help="whether to include parallel computing config files") | |||
|
141 | def _cluster_changed(self, name, old, new): | |||
|
142 | cluster_files = [ 'ipcontroller_config.py', | |||
|
143 | 'ipengine_config.py', | |||
|
144 | 'ipcluster_config.py' | |||
|
145 | ] | |||
|
146 | if new: | |||
|
147 | for cf in cluster_files: | |||
|
148 | self.config_files.append(cf) | |||
|
149 | else: | |||
|
150 | for cf in cluster_files: | |||
|
151 | if cf in self.config_files: | |||
|
152 | self.config_files.remove(cf) | |||
|
153 | ||||
|
154 | def parse_command_line(self, argv): | |||
|
155 | super(ProfileCreate, self).parse_command_line(argv) | |||
|
156 | # accept positional arg as profile name | |||
|
157 | if self.extra_args: | |||
|
158 | self.profile = self.extra_args[0] | |||
|
159 | ||||
|
160 | flags = Dict(create_flags) | |||
|
161 | ||||
|
162 | aliases = Dict(dict(profile='BaseIPythonApplication.profile')) | |||
|
163 | ||||
|
164 | classes = [ProfileDir] | |||
|
165 | ||||
|
166 | class ProfileApp(Application): | |||
|
167 | name = u'ipython-profile' | |||
|
168 | description = profile_help | |||
|
169 | ||||
|
170 | subcommands = Dict(dict( | |||
|
171 | create = (ProfileCreate, "Create a new profile dir with default config files"), | |||
|
172 | list = (ProfileList, "List existing profiles") | |||
|
173 | )) | |||
|
174 |
@@ -0,0 +1,206 b'' | |||||
|
1 | # encoding: utf-8 | |||
|
2 | """ | |||
|
3 | An object for managing IPython profile directories. | |||
|
4 | ||||
|
5 | Authors: | |||
|
6 | ||||
|
7 | * Brian Granger | |||
|
8 | * Fernando Perez | |||
|
9 | * Min RK | |||
|
10 | ||||
|
11 | """ | |||
|
12 | ||||
|
13 | #----------------------------------------------------------------------------- | |||
|
14 | # Copyright (C) 2008-2011 The IPython Development Team | |||
|
15 | # | |||
|
16 | # Distributed under the terms of the BSD License. The full license is in | |||
|
17 | # the file COPYING, distributed as part of this software. | |||
|
18 | #----------------------------------------------------------------------------- | |||
|
19 | ||||
|
20 | #----------------------------------------------------------------------------- | |||
|
21 | # Imports | |||
|
22 | #----------------------------------------------------------------------------- | |||
|
23 | ||||
|
24 | import os | |||
|
25 | import shutil | |||
|
26 | import sys | |||
|
27 | ||||
|
28 | from IPython.config.configurable import Configurable | |||
|
29 | from IPython.config.loader import Config | |||
|
30 | from IPython.utils.path import get_ipython_package_dir, expand_path | |||
|
31 | from IPython.utils.traitlets import List, Unicode, Bool | |||
|
32 | ||||
|
33 | #----------------------------------------------------------------------------- | |||
|
34 | # Classes and functions | |||
|
35 | #----------------------------------------------------------------------------- | |||
|
36 | ||||
|
37 | ||||
|
38 | #----------------------------------------------------------------------------- | |||
|
39 | # Module errors | |||
|
40 | #----------------------------------------------------------------------------- | |||
|
41 | ||||
|
42 | class ProfileDirError(Exception): | |||
|
43 | pass | |||
|
44 | ||||
|
45 | ||||
|
46 | #----------------------------------------------------------------------------- | |||
|
47 | # Class for managing profile directories | |||
|
48 | #----------------------------------------------------------------------------- | |||
|
49 | ||||
|
50 | class ProfileDir(Configurable): | |||
|
51 | """An object to manage the profile directory and its resources. | |||
|
52 | ||||
|
53 | The profile directory is used by all IPython applications, to manage | |||
|
54 | configuration, logging and security. | |||
|
55 | ||||
|
56 | This object knows how to find, create and manage these directories. This | |||
|
57 | should be used by any code that wants to handle profiles. | |||
|
58 | """ | |||
|
59 | ||||
|
60 | security_dir_name = Unicode('security') | |||
|
61 | log_dir_name = Unicode('log') | |||
|
62 | pid_dir_name = Unicode('pid') | |||
|
63 | security_dir = Unicode(u'') | |||
|
64 | log_dir = Unicode(u'') | |||
|
65 | pid_dir = Unicode(u'') | |||
|
66 | ||||
|
67 | location = Unicode(u'', config=True, | |||
|
68 | help="""Set the profile location directly. This overrides the logic used by the | |||
|
69 | `profile` option.""", | |||
|
70 | ) | |||
|
71 | ||||
|
72 | _location_isset = Bool(False) # flag for detecting multiply set location | |||
|
73 | ||||
|
74 | def _location_changed(self, name, old, new): | |||
|
75 | if self._location_isset: | |||
|
76 | raise RuntimeError("Cannot set profile location more than once.") | |||
|
77 | self._location_isset = True | |||
|
78 | if not os.path.isdir(new): | |||
|
79 | os.makedirs(new) | |||
|
80 | ||||
|
81 | # ensure config files exist: | |||
|
82 | self.security_dir = os.path.join(new, self.security_dir_name) | |||
|
83 | self.log_dir = os.path.join(new, self.log_dir_name) | |||
|
84 | self.pid_dir = os.path.join(new, self.pid_dir_name) | |||
|
85 | self.check_dirs() | |||
|
86 | ||||
|
87 | def _log_dir_changed(self, name, old, new): | |||
|
88 | self.check_log_dir() | |||
|
89 | ||||
|
90 | def check_log_dir(self): | |||
|
91 | if not os.path.isdir(self.log_dir): | |||
|
92 | os.mkdir(self.log_dir) | |||
|
93 | ||||
|
94 | def _security_dir_changed(self, name, old, new): | |||
|
95 | self.check_security_dir() | |||
|
96 | ||||
|
97 | def check_security_dir(self): | |||
|
98 | if not os.path.isdir(self.security_dir): | |||
|
99 | os.mkdir(self.security_dir, 0700) | |||
|
100 | else: | |||
|
101 | os.chmod(self.security_dir, 0700) | |||
|
102 | ||||
|
103 | def _pid_dir_changed(self, name, old, new): | |||
|
104 | self.check_pid_dir() | |||
|
105 | ||||
|
106 | def check_pid_dir(self): | |||
|
107 | if not os.path.isdir(self.pid_dir): | |||
|
108 | os.mkdir(self.pid_dir, 0700) | |||
|
109 | else: | |||
|
110 | os.chmod(self.pid_dir, 0700) | |||
|
111 | ||||
|
112 | def check_dirs(self): | |||
|
113 | self.check_security_dir() | |||
|
114 | self.check_log_dir() | |||
|
115 | self.check_pid_dir() | |||
|
116 | ||||
|
117 | def copy_config_file(self, config_file, path=None, overwrite=False): | |||
|
118 | """Copy a default config file into the active profile directory. | |||
|
119 | ||||
|
120 | Default configuration files are kept in :mod:`IPython.config.default`. | |||
|
121 | This function moves these from that location to the working profile | |||
|
122 | directory. | |||
|
123 | """ | |||
|
124 | dst = os.path.join(self.location, config_file) | |||
|
125 | if os.path.isfile(dst) and not overwrite: | |||
|
126 | return | |||
|
127 | if path is None: | |||
|
128 | path = os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default') | |||
|
129 | src = os.path.join(path, config_file) | |||
|
130 | shutil.copy(src, dst) | |||
|
131 | ||||
|
132 | @classmethod | |||
|
133 | def create_profile_dir(cls, profile_dir, config=None): | |||
|
134 | """Create a new profile directory given a full path. | |||
|
135 | ||||
|
136 | Parameters | |||
|
137 | ---------- | |||
|
138 | profile_dir : str | |||
|
139 | The full path to the profile directory. If it does exist, it will | |||
|
140 | be used. If not, it will be created. | |||
|
141 | """ | |||
|
142 | return cls(location=profile_dir, config=config) | |||
|
143 | ||||
|
144 | @classmethod | |||
|
145 | def create_profile_dir_by_name(cls, path, name=u'default', config=None): | |||
|
146 | """Create a profile dir by profile name and path. | |||
|
147 | ||||
|
148 | Parameters | |||
|
149 | ---------- | |||
|
150 | path : unicode | |||
|
151 | The path (directory) to put the profile directory in. | |||
|
152 | name : unicode | |||
|
153 | The name of the profile. The name of the profile directory will | |||
|
154 | be "profile_<profile>". | |||
|
155 | """ | |||
|
156 | if not os.path.isdir(path): | |||
|
157 | raise ProfileDirError('Directory not found: %s' % path) | |||
|
158 | profile_dir = os.path.join(path, u'profile_' + name) | |||
|
159 | return cls(location=profile_dir, config=config) | |||
|
160 | ||||
|
161 | @classmethod | |||
|
162 | def find_profile_dir_by_name(cls, ipython_dir, name=u'default', config=None): | |||
|
163 | """Find an existing profile dir by profile name, return its ProfileDir. | |||
|
164 | ||||
|
165 | This searches through a sequence of paths for a profile dir. If it | |||
|
166 | is not found, a :class:`ProfileDirError` exception will be raised. | |||
|
167 | ||||
|
168 | The search path algorithm is: | |||
|
169 | 1. ``os.getcwd()`` | |||
|
170 | 2. ``ipython_dir`` | |||
|
171 | ||||
|
172 | Parameters | |||
|
173 | ---------- | |||
|
174 | ipython_dir : unicode or str | |||
|
175 | The IPython directory to use. | |||
|
176 | name : unicode or str | |||
|
177 | The name of the profile. The name of the profile directory | |||
|
178 | will be "profile_<profile>". | |||
|
179 | """ | |||
|
180 | dirname = u'profile_' + name | |||
|
181 | paths = [os.getcwdu(), ipython_dir] | |||
|
182 | for p in paths: | |||
|
183 | profile_dir = os.path.join(p, dirname) | |||
|
184 | if os.path.isdir(profile_dir): | |||
|
185 | return cls(location=profile_dir, config=config) | |||
|
186 | else: | |||
|
187 | raise ProfileDirError('Profile directory not found in paths: %s' % dirname) | |||
|
188 | ||||
|
189 | @classmethod | |||
|
190 | def find_profile_dir(cls, profile_dir, config=None): | |||
|
191 | """Find/create a profile dir and return its ProfileDir. | |||
|
192 | ||||
|
193 | This will create the profile directory if it doesn't exist. | |||
|
194 | ||||
|
195 | Parameters | |||
|
196 | ---------- | |||
|
197 | profile_dir : unicode or str | |||
|
198 | The path of the profile directory. This is expanded using | |||
|
199 | :func:`IPython.utils.genutils.expand_path`. | |||
|
200 | """ | |||
|
201 | profile_dir = expand_path(profile_dir) | |||
|
202 | if not os.path.isdir(profile_dir): | |||
|
203 | raise ProfileDirError('Profile directory not found: %s' % profile_dir) | |||
|
204 | return cls(location=profile_dir, config=config) | |||
|
205 | ||||
|
206 |
@@ -14,12 +14,10 b' Authors:' | |||||
14 | * Fernando Perez |
|
14 | * Fernando Perez | |
15 | * Min RK |
|
15 | * Min RK | |
16 |
|
16 | |||
17 | Notes |
|
|||
18 | ----- |
|
|||
19 | """ |
|
17 | """ | |
20 |
|
18 | |||
21 | #----------------------------------------------------------------------------- |
|
19 | #----------------------------------------------------------------------------- | |
22 |
# Copyright (C) 2008-20 |
|
20 | # Copyright (C) 2008-2011 The IPython Development Team | |
23 | # |
|
21 | # | |
24 | # Distributed under the terms of the BSD License. The full license is in |
|
22 | # Distributed under the terms of the BSD License. The full license is in | |
25 | # the file COPYING, distributed as part of this software. |
|
23 | # the file COPYING, distributed as part of this software. | |
@@ -38,7 +36,8 b' from IPython.config.application import Application' | |||||
38 | from IPython.config.configurable import Configurable |
|
36 | from IPython.config.configurable import Configurable | |
39 | from IPython.config.loader import Config |
|
37 | from IPython.config.loader import Config | |
40 | from IPython.core import release, crashhandler |
|
38 | from IPython.core import release, crashhandler | |
41 | from IPython.utils.path import get_ipython_dir, get_ipython_package_dir, expand_path |
|
39 | from IPython.core.profiledir import ProfileDir, ProfileDirError | |
|
40 | from IPython.utils.path import get_ipython_dir, get_ipython_package_dir | |||
42 | from IPython.utils.traitlets import List, Unicode, Type, Bool, Dict |
|
41 | from IPython.utils.traitlets import List, Unicode, Type, Bool, Dict | |
43 |
|
42 | |||
44 | #----------------------------------------------------------------------------- |
|
43 | #----------------------------------------------------------------------------- | |
@@ -47,175 +46,6 b' from IPython.utils.traitlets import List, Unicode, Type, Bool, Dict' | |||||
47 |
|
46 | |||
48 |
|
47 | |||
49 | #----------------------------------------------------------------------------- |
|
48 | #----------------------------------------------------------------------------- | |
50 | # Module errors |
|
|||
51 | #----------------------------------------------------------------------------- |
|
|||
52 |
|
||||
53 | class ProfileDirError(Exception): |
|
|||
54 | pass |
|
|||
55 |
|
||||
56 |
|
||||
57 | #----------------------------------------------------------------------------- |
|
|||
58 | # Class for managing profile directories |
|
|||
59 | #----------------------------------------------------------------------------- |
|
|||
60 |
|
||||
61 | class ProfileDir(Configurable): |
|
|||
62 | """An object to manage the profile directory and its resources. |
|
|||
63 |
|
||||
64 | The profile directory is used by all IPython applications, to manage |
|
|||
65 | configuration, logging and security. |
|
|||
66 |
|
||||
67 | This object knows how to find, create and manage these directories. This |
|
|||
68 | should be used by any code that wants to handle profiles. |
|
|||
69 | """ |
|
|||
70 |
|
||||
71 | security_dir_name = Unicode('security') |
|
|||
72 | log_dir_name = Unicode('log') |
|
|||
73 | pid_dir_name = Unicode('pid') |
|
|||
74 | security_dir = Unicode(u'') |
|
|||
75 | log_dir = Unicode(u'') |
|
|||
76 | pid_dir = Unicode(u'') |
|
|||
77 |
|
||||
78 | location = Unicode(u'', config=True, |
|
|||
79 | help="""Set the profile location directly. This overrides the logic used by the |
|
|||
80 | `profile` option.""", |
|
|||
81 | ) |
|
|||
82 |
|
||||
83 | _location_isset = Bool(False) # flag for detecting multiply set location |
|
|||
84 |
|
||||
85 | def _location_changed(self, name, old, new): |
|
|||
86 | if self._location_isset: |
|
|||
87 | raise RuntimeError("Cannot set profile location more than once.") |
|
|||
88 | self._location_isset = True |
|
|||
89 | if not os.path.isdir(new): |
|
|||
90 | os.makedirs(new) |
|
|||
91 |
|
||||
92 | # ensure config files exist: |
|
|||
93 | self.security_dir = os.path.join(new, self.security_dir_name) |
|
|||
94 | self.log_dir = os.path.join(new, self.log_dir_name) |
|
|||
95 | self.pid_dir = os.path.join(new, self.pid_dir_name) |
|
|||
96 | self.check_dirs() |
|
|||
97 |
|
||||
98 | def _log_dir_changed(self, name, old, new): |
|
|||
99 | self.check_log_dir() |
|
|||
100 |
|
||||
101 | def check_log_dir(self): |
|
|||
102 | if not os.path.isdir(self.log_dir): |
|
|||
103 | os.mkdir(self.log_dir) |
|
|||
104 |
|
||||
105 | def _security_dir_changed(self, name, old, new): |
|
|||
106 | self.check_security_dir() |
|
|||
107 |
|
||||
108 | def check_security_dir(self): |
|
|||
109 | if not os.path.isdir(self.security_dir): |
|
|||
110 | os.mkdir(self.security_dir, 0700) |
|
|||
111 | else: |
|
|||
112 | os.chmod(self.security_dir, 0700) |
|
|||
113 |
|
||||
114 | def _pid_dir_changed(self, name, old, new): |
|
|||
115 | self.check_pid_dir() |
|
|||
116 |
|
||||
117 | def check_pid_dir(self): |
|
|||
118 | if not os.path.isdir(self.pid_dir): |
|
|||
119 | os.mkdir(self.pid_dir, 0700) |
|
|||
120 | else: |
|
|||
121 | os.chmod(self.pid_dir, 0700) |
|
|||
122 |
|
||||
123 | def check_dirs(self): |
|
|||
124 | self.check_security_dir() |
|
|||
125 | self.check_log_dir() |
|
|||
126 | self.check_pid_dir() |
|
|||
127 |
|
||||
128 | def copy_config_file(self, config_file, path=None, overwrite=False): |
|
|||
129 | """Copy a default config file into the active profile directory. |
|
|||
130 |
|
||||
131 | Default configuration files are kept in :mod:`IPython.config.default`. |
|
|||
132 | This function moves these from that location to the working profile |
|
|||
133 | directory. |
|
|||
134 | """ |
|
|||
135 | dst = os.path.join(self.location, config_file) |
|
|||
136 | if os.path.isfile(dst) and not overwrite: |
|
|||
137 | return |
|
|||
138 | if path is None: |
|
|||
139 | path = os.path.join(get_ipython_package_dir(), u'config', u'profile', u'default') |
|
|||
140 | src = os.path.join(path, config_file) |
|
|||
141 | shutil.copy(src, dst) |
|
|||
142 |
|
||||
143 | @classmethod |
|
|||
144 | def create_profile_dir(cls, profile_dir, config=None): |
|
|||
145 | """Create a new profile directory given a full path. |
|
|||
146 |
|
||||
147 | Parameters |
|
|||
148 | ---------- |
|
|||
149 | profile_dir : str |
|
|||
150 | The full path to the profile directory. If it does exist, it will |
|
|||
151 | be used. If not, it will be created. |
|
|||
152 | """ |
|
|||
153 | return cls(location=profile_dir, config=config) |
|
|||
154 |
|
||||
155 | @classmethod |
|
|||
156 | def create_profile_dir_by_name(cls, path, name=u'default', config=None): |
|
|||
157 | """Create a profile dir by profile name and path. |
|
|||
158 |
|
||||
159 | Parameters |
|
|||
160 | ---------- |
|
|||
161 | path : unicode |
|
|||
162 | The path (directory) to put the profile directory in. |
|
|||
163 | name : unicode |
|
|||
164 | The name of the profile. The name of the profile directory will |
|
|||
165 | be "profile_<profile>". |
|
|||
166 | """ |
|
|||
167 | if not os.path.isdir(path): |
|
|||
168 | raise ProfileDirError('Directory not found: %s' % path) |
|
|||
169 | profile_dir = os.path.join(path, u'profile_' + name) |
|
|||
170 | return cls(location=profile_dir, config=config) |
|
|||
171 |
|
||||
172 | @classmethod |
|
|||
173 | def find_profile_dir_by_name(cls, ipython_dir, name=u'default', config=None): |
|
|||
174 | """Find an existing profile dir by profile name, return its ProfileDir. |
|
|||
175 |
|
||||
176 | This searches through a sequence of paths for a profile dir. If it |
|
|||
177 | is not found, a :class:`ProfileDirError` exception will be raised. |
|
|||
178 |
|
||||
179 | The search path algorithm is: |
|
|||
180 | 1. ``os.getcwd()`` |
|
|||
181 | 2. ``ipython_dir`` |
|
|||
182 |
|
||||
183 | Parameters |
|
|||
184 | ---------- |
|
|||
185 | ipython_dir : unicode or str |
|
|||
186 | The IPython directory to use. |
|
|||
187 | name : unicode or str |
|
|||
188 | The name of the profile. The name of the profile directory |
|
|||
189 | will be "profile_<profile>". |
|
|||
190 | """ |
|
|||
191 | dirname = u'profile_' + name |
|
|||
192 | paths = [os.getcwdu(), ipython_dir] |
|
|||
193 | for p in paths: |
|
|||
194 | profile_dir = os.path.join(p, dirname) |
|
|||
195 | if os.path.isdir(profile_dir): |
|
|||
196 | return cls(location=profile_dir, config=config) |
|
|||
197 | else: |
|
|||
198 | raise ProfileDirError('Profile directory not found in paths: %s' % dirname) |
|
|||
199 |
|
||||
200 | @classmethod |
|
|||
201 | def find_profile_dir(cls, profile_dir, config=None): |
|
|||
202 | """Find/create a profile dir and return its ProfileDir. |
|
|||
203 |
|
||||
204 | This will create the profile directory if it doesn't exist. |
|
|||
205 |
|
||||
206 | Parameters |
|
|||
207 | ---------- |
|
|||
208 | profile_dir : unicode or str |
|
|||
209 | The path of the profile directory. This is expanded using |
|
|||
210 | :func:`IPython.utils.genutils.expand_path`. |
|
|||
211 | """ |
|
|||
212 | profile_dir = expand_path(profile_dir) |
|
|||
213 | if not os.path.isdir(profile_dir): |
|
|||
214 | raise ProfileDirError('Profile directory not found: %s' % profile_dir) |
|
|||
215 | return cls(location=profile_dir, config=config) |
|
|||
216 |
|
||||
217 |
|
||||
218 | #----------------------------------------------------------------------------- |
|
|||
219 | # Base Application Class |
|
49 | # Base Application Class | |
220 | #----------------------------------------------------------------------------- |
|
50 | #----------------------------------------------------------------------------- | |
221 |
|
51 |
@@ -54,10 +54,10 b' from IPython.core.inputsplitter import IPythonInputSplitter' | |||||
54 | from IPython.core.logger import Logger |
|
54 | from IPython.core.logger import Logger | |
55 | from IPython.core.macro import Macro |
|
55 | from IPython.core.macro import Macro | |
56 | from IPython.core.magic import Magic |
|
56 | from IPython.core.magic import Magic | |
57 | from IPython.core.application import ProfileDir |
|
|||
58 | from IPython.core.payload import PayloadManager |
|
57 | from IPython.core.payload import PayloadManager | |
59 | from IPython.core.plugin import PluginManager |
|
58 | from IPython.core.plugin import PluginManager | |
60 | from IPython.core.prefilter import PrefilterManager, ESC_MAGIC |
|
59 | from IPython.core.prefilter import PrefilterManager, ESC_MAGIC | |
|
60 | from IPython.core.profiledir import ProfileDir | |||
61 | from IPython.external.Itpl import ItplNS |
|
61 | from IPython.external.Itpl import ItplNS | |
62 | from IPython.utils import PyColorize |
|
62 | from IPython.utils import PyColorize | |
63 | from IPython.utils import io |
|
63 | from IPython.utils import io |
@@ -46,7 +46,7 b' from IPython.core import debugger, oinspect' | |||||
46 | from IPython.core.error import TryNext |
|
46 | from IPython.core.error import TryNext | |
47 | from IPython.core.error import UsageError |
|
47 | from IPython.core.error import UsageError | |
48 | from IPython.core.fakemodule import FakeModule |
|
48 | from IPython.core.fakemodule import FakeModule | |
49 |
from IPython.core. |
|
49 | from IPython.core.profiledir import ProfileDir | |
50 | from IPython.core.macro import Macro |
|
50 | from IPython.core.macro import Macro | |
51 | from IPython.core import page |
|
51 | from IPython.core import page | |
52 | from IPython.core.prefilter import ESC_MAGIC |
|
52 | from IPython.core.prefilter import ESC_MAGIC |
@@ -27,7 +27,8 b' from pygments.styles import get_all_styles' | |||||
27 |
|
27 | |||
28 | # Local imports |
|
28 | # Local imports | |
29 | from IPython.config.application import boolean_flag |
|
29 | from IPython.config.application import boolean_flag | |
30 |
from IPython.core.application import |
|
30 | from IPython.core.application import BaseIPythonApplication | |
|
31 | from IPython.core.profiledir import ProfileDir | |||
31 | from IPython.frontend.qt.console.frontend_widget import FrontendWidget |
|
32 | from IPython.frontend.qt.console.frontend_widget import FrontendWidget | |
32 | from IPython.frontend.qt.console.ipython_widget import IPythonWidget |
|
33 | from IPython.frontend.qt.console.ipython_widget import IPythonWidget | |
33 | from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget |
|
34 | from IPython.frontend.qt.console.rich_ipython_widget import RichIPythonWidget |
@@ -203,7 +203,9 b' class TerminalIPythonApp(BaseIPythonApplication, InteractiveShellApp):' | |||||
203 | subcommands = Dict(dict( |
|
203 | subcommands = Dict(dict( | |
204 | qtconsole=('IPython.frontend.qt.console.qtconsoleapp.IPythonQtConsoleApp', |
|
204 | qtconsole=('IPython.frontend.qt.console.qtconsoleapp.IPythonQtConsoleApp', | |
205 | """Launch the IPython Qt Console.""" |
|
205 | """Launch the IPython Qt Console.""" | |
206 | ) |
|
206 | ), | |
|
207 | profile = ("IPython.core.profileapp.ProfileApp", | |||
|
208 | "Create and manage IPython profiles.") | |||
207 | )) |
|
209 | )) | |
208 |
|
210 | |||
209 | # *do* autocreate requested profile |
|
211 | # *do* autocreate requested profile |
@@ -33,7 +33,8 b' from zmq.eventloop import ioloop' | |||||
33 |
|
33 | |||
34 | from IPython.config.application import Application, boolean_flag |
|
34 | from IPython.config.application import Application, boolean_flag | |
35 | from IPython.config.loader import Config |
|
35 | from IPython.config.loader import Config | |
36 |
from IPython.core.application import BaseIPythonApplication |
|
36 | from IPython.core.application import BaseIPythonApplication | |
|
37 | from IPython.core.profiledir import ProfileDir | |||
37 | from IPython.utils.daemonize import daemonize |
|
38 | from IPython.utils.daemonize import daemonize | |
38 | from IPython.utils.importstring import import_item |
|
39 | from IPython.utils.importstring import import_item | |
39 | from IPython.utils.traitlets import Int, Unicode, Bool, CFloat, Dict, List |
|
40 | from IPython.utils.traitlets import Int, Unicode, Bool, CFloat, Dict, List | |
@@ -89,7 +90,7 b' start_help = """Start an IPython cluster for parallel computing' | |||||
89 | Start an ipython cluster by its profile name or cluster |
|
90 | Start an ipython cluster by its profile name or cluster | |
90 | directory. Cluster directories contain configuration, log and |
|
91 | directory. Cluster directories contain configuration, log and | |
91 | security related files and are named using the convention |
|
92 | security related files and are named using the convention | |
92 |
' |
|
93 | 'profile_<name>' and should be creating using the 'start' | |
93 | subcommand of 'ipcluster'. If your cluster directory is in |
|
94 | subcommand of 'ipcluster'. If your cluster directory is in | |
94 | the cwd or the ipython directory, you can simply refer to it |
|
95 | the cwd or the ipython directory, you can simply refer to it | |
95 | using its profile name, 'ipcluster start n=4 profile=<profile>`, |
|
96 | using its profile name, 'ipcluster start n=4 profile=<profile>`, | |
@@ -99,7 +100,7 b' stop_help = """Stop a running IPython cluster' | |||||
99 |
|
100 | |||
100 | Stop a running ipython cluster by its profile name or cluster |
|
101 | Stop a running ipython cluster by its profile name or cluster | |
101 | directory. Cluster directories are named using the convention |
|
102 | directory. Cluster directories are named using the convention | |
102 |
' |
|
103 | 'profile_<name>'. If your cluster directory is in | |
103 | the cwd or the ipython directory, you can simply refer to it |
|
104 | the cwd or the ipython directory, you can simply refer to it | |
104 | using its profile name, 'ipcluster stop profile=<profile>`, otherwise |
|
105 | using its profile name, 'ipcluster stop profile=<profile>`, otherwise | |
105 | use the 'profile_dir' option. |
|
106 | use the 'profile_dir' option. | |
@@ -110,93 +111,12 b' Start one or more engines to connect to an existing Cluster' | |||||
110 | by profile name or cluster directory. |
|
111 | by profile name or cluster directory. | |
111 | Cluster directories contain configuration, log and |
|
112 | Cluster directories contain configuration, log and | |
112 | security related files and are named using the convention |
|
113 | security related files and are named using the convention | |
113 |
' |
|
114 | 'profile_<name>' and should be creating using the 'start' | |
114 | subcommand of 'ipcluster'. If your cluster directory is in |
|
115 | subcommand of 'ipcluster'. If your cluster directory is in | |
115 | the cwd or the ipython directory, you can simply refer to it |
|
116 | the cwd or the ipython directory, you can simply refer to it | |
116 | using its profile name, 'ipcluster engines n=4 profile=<profile>`, |
|
117 | using its profile name, 'ipcluster engines n=4 profile=<profile>`, | |
117 | otherwise use the 'profile_dir' option. |
|
118 | otherwise use the 'profile_dir' option. | |
118 | """ |
|
119 | """ | |
119 | create_help = """Create an ipcluster profile by name |
|
|||
120 |
|
||||
121 | Create an ipython cluster directory by its profile name or |
|
|||
122 | cluster directory path. Cluster directories contain |
|
|||
123 | configuration, log and security related files and are named |
|
|||
124 | using the convention 'cluster_<profile>'. By default they are |
|
|||
125 | located in your ipython directory. Once created, you will |
|
|||
126 | probably need to edit the configuration files in the cluster |
|
|||
127 | directory to configure your cluster. Most users will create a |
|
|||
128 | cluster directory by profile name, |
|
|||
129 | `ipcluster create profile=mycluster`, which will put the directory |
|
|||
130 | in `<ipython_dir>/cluster_mycluster`. |
|
|||
131 | """ |
|
|||
132 | list_help = """List available cluster profiles |
|
|||
133 |
|
||||
134 | List all available clusters, by cluster directory, that can |
|
|||
135 | be found in the current working directly or in the ipython |
|
|||
136 | directory. Cluster directories are named using the convention |
|
|||
137 | 'cluster_<profile>'. |
|
|||
138 | """ |
|
|||
139 |
|
||||
140 |
|
||||
141 | class IPClusterList(BaseIPythonApplication): |
|
|||
142 | name = u'ipcluster-list' |
|
|||
143 | description = list_help |
|
|||
144 |
|
||||
145 | # empty aliases |
|
|||
146 | aliases=Dict() |
|
|||
147 | flags = Dict(base_flags) |
|
|||
148 |
|
||||
149 | def _log_level_default(self): |
|
|||
150 | return 20 |
|
|||
151 |
|
||||
152 | def list_profile_dirs(self): |
|
|||
153 | # Find the search paths |
|
|||
154 | profile_dir_paths = os.environ.get('IPYTHON_PROFILE_PATH','') |
|
|||
155 | if profile_dir_paths: |
|
|||
156 | profile_dir_paths = profile_dir_paths.split(':') |
|
|||
157 | else: |
|
|||
158 | profile_dir_paths = [] |
|
|||
159 |
|
||||
160 | ipython_dir = self.ipython_dir |
|
|||
161 |
|
||||
162 | paths = [os.getcwd(), ipython_dir] + profile_dir_paths |
|
|||
163 | paths = list(set(paths)) |
|
|||
164 |
|
||||
165 | self.log.info('Searching for cluster profiles in paths: %r' % paths) |
|
|||
166 | for path in paths: |
|
|||
167 | files = os.listdir(path) |
|
|||
168 | for f in files: |
|
|||
169 | full_path = os.path.join(path, f) |
|
|||
170 | if os.path.isdir(full_path) and f.startswith('profile_') and \ |
|
|||
171 | os.path.isfile(os.path.join(full_path, 'ipcontroller_config.py')): |
|
|||
172 | profile = f.split('_')[-1] |
|
|||
173 | start_cmd = 'ipcluster start profile=%s n=4' % profile |
|
|||
174 | print start_cmd + " ==> " + full_path |
|
|||
175 |
|
||||
176 | def start(self): |
|
|||
177 | self.list_profile_dirs() |
|
|||
178 |
|
||||
179 |
|
||||
180 | # `ipcluster create` will be deprecated when `ipython profile create` or equivalent exists |
|
|||
181 |
|
||||
182 | create_flags = {} |
|
|||
183 | create_flags.update(base_flags) |
|
|||
184 | create_flags.update(boolean_flag('reset', 'IPClusterCreate.overwrite', |
|
|||
185 | "reset config files to defaults", "leave existing config files")) |
|
|||
186 |
|
||||
187 | class IPClusterCreate(BaseParallelApplication): |
|
|||
188 | name = u'ipcluster-create' |
|
|||
189 | description = create_help |
|
|||
190 | auto_create = Bool(True) |
|
|||
191 | config_file_name = Unicode(default_config_file_name) |
|
|||
192 |
|
||||
193 | flags = Dict(create_flags) |
|
|||
194 |
|
||||
195 | aliases = Dict(dict(profile='BaseIPythonApplication.profile')) |
|
|||
196 |
|
||||
197 | classes = [ProfileDir] |
|
|||
198 |
|
||||
199 |
|
||||
200 | stop_aliases = dict( |
|
120 | stop_aliases = dict( | |
201 | signal='IPClusterStop.signal', |
|
121 | signal='IPClusterStop.signal', | |
202 | profile='BaseIPythonApplication.profile', |
|
122 | profile='BaseIPythonApplication.profile', |
@@ -37,7 +37,7 b' from zmq.log.handlers import PUBHandler' | |||||
37 | from zmq.utils import jsonapi as json |
|
37 | from zmq.utils import jsonapi as json | |
38 |
|
38 | |||
39 | from IPython.config.application import boolean_flag |
|
39 | from IPython.config.application import boolean_flag | |
40 |
from IPython.core. |
|
40 | from IPython.core.profiledir import ProfileDir | |
41 |
|
41 | |||
42 | from IPython.parallel.apps.baseapp import ( |
|
42 | from IPython.parallel.apps.baseapp import ( | |
43 | BaseParallelApplication, |
|
43 | BaseParallelApplication, | |
@@ -80,7 +80,7 b' The IPython controller provides a gateway between the IPython engines and' | |||||
80 | clients. The controller needs to be started before the engines and can be |
|
80 | clients. The controller needs to be started before the engines and can be | |
81 | configured using command line options or using a cluster directory. Cluster |
|
81 | configured using command line options or using a cluster directory. Cluster | |
82 | directories contain config, log and security files and are usually located in |
|
82 | directories contain config, log and security files and are usually located in | |
83 |
your ipython directory and named as " |
|
83 | your ipython directory and named as "profile_name". See the `profile` | |
84 | and `profile_dir` options for details. |
|
84 | and `profile_dir` options for details. | |
85 | """ |
|
85 | """ | |
86 |
|
86 |
@@ -28,7 +28,7 b' import sys' | |||||
28 | import zmq |
|
28 | import zmq | |
29 | from zmq.eventloop import ioloop |
|
29 | from zmq.eventloop import ioloop | |
30 |
|
30 | |||
31 |
from IPython.core. |
|
31 | from IPython.core.profiledir import ProfileDir | |
32 | from IPython.parallel.apps.baseapp import BaseParallelApplication |
|
32 | from IPython.parallel.apps.baseapp import BaseParallelApplication | |
33 | from IPython.zmq.log import EnginePUBHandler |
|
33 | from IPython.zmq.log import EnginePUBHandler | |
34 |
|
34 | |||
@@ -55,7 +55,7 b' IPython engines run in parallel and perform computations on behalf of a client' | |||||
55 | and controller. A controller needs to be started before the engines. The |
|
55 | and controller. A controller needs to be started before the engines. The | |
56 | engine can be configured using command line options or using a cluster |
|
56 | engine can be configured using command line options or using a cluster | |
57 | directory. Cluster directories contain config, log and security files and are |
|
57 | directory. Cluster directories contain config, log and security files and are | |
58 |
usually located in your ipython directory and named as " |
|
58 | usually located in your ipython directory and named as "profile_name". | |
59 | See the `profile` and `profile_dir` options for details. |
|
59 | See the `profile` and `profile_dir` options for details. | |
60 | """ |
|
60 | """ | |
61 |
|
61 |
@@ -25,7 +25,7 b' import sys' | |||||
25 |
|
25 | |||
26 | import zmq |
|
26 | import zmq | |
27 |
|
27 | |||
28 |
from IPython.core. |
|
28 | from IPython.core.profiledir import ProfileDir | |
29 | from IPython.utils.traitlets import Bool, Dict, Unicode |
|
29 | from IPython.utils.traitlets import Bool, Dict, Unicode | |
30 |
|
30 | |||
31 | from IPython.parallel.apps.baseapp import ( |
|
31 | from IPython.parallel.apps.baseapp import ( | |
@@ -47,7 +47,7 b' IPython controllers and engines (and your own processes) can broadcast log messa' | |||||
47 | by registering a `zmq.log.handlers.PUBHandler` with the `logging` module. The |
|
47 | by registering a `zmq.log.handlers.PUBHandler` with the `logging` module. The | |
48 | logger can be configured using command line options or using a cluster |
|
48 | logger can be configured using command line options or using a cluster | |
49 | directory. Cluster directories contain config, log and security files and are |
|
49 | directory. Cluster directories contain config, log and security files and are | |
50 |
usually located in your ipython directory and named as " |
|
50 | usually located in your ipython directory and named as "profile_name". | |
51 | See the `profile` and `profile_dir` options for details. |
|
51 | See the `profile` and `profile_dir` options for details. | |
52 | """ |
|
52 | """ | |
53 |
|
53 |
@@ -40,7 +40,7 b' from IPython.parallel import util' | |||||
40 | from IPython.zmq.session import Session, Message |
|
40 | from IPython.zmq.session import Session, Message | |
41 |
|
41 | |||
42 | from .asyncresult import AsyncResult, AsyncHubResult |
|
42 | from .asyncresult import AsyncResult, AsyncHubResult | |
43 |
from IPython.core. |
|
43 | from IPython.core.profiledir import ProfileDir, ProfileDirError | |
44 | from .view import DirectView, LoadBalancedView |
|
44 | from .view import DirectView, LoadBalancedView | |
45 |
|
45 | |||
46 | #-------------------------------------------------------------------------- |
|
46 | #-------------------------------------------------------------------------- |
@@ -413,13 +413,13 b' def check_for_old_config(ipython_dir=None):' | |||||
413 | if ipython_dir is None: |
|
413 | if ipython_dir is None: | |
414 | ipython_dir = get_ipython_dir() |
|
414 | ipython_dir = get_ipython_dir() | |
415 |
|
415 | |||
416 | old_configs = ['ipy_user_conf.py', 'ipythonrc'] |
|
416 | old_configs = ['ipy_user_conf.py', 'ipythonrc', 'ipython_config.py'] | |
417 | for cfg in old_configs: |
|
417 | for cfg in old_configs: | |
418 | f = os.path.join(ipython_dir, cfg) |
|
418 | f = os.path.join(ipython_dir, cfg) | |
419 | if os.path.exists(f): |
|
419 | if os.path.exists(f): | |
420 | warn.warn("""Found old IPython config file %r. |
|
420 | warn.warn("""Found old IPython config file %r. | |
421 | The IPython configuration system has changed as of 0.11, and this file will be ignored. |
|
421 | The IPython configuration system has changed as of 0.11, and this file will be ignored. | |
422 | See http://ipython.github.com/ipython-doc/dev/config for details on the new config system. |
|
422 | See http://ipython.github.com/ipython-doc/dev/config for details on the new config system. | |
423 | The current default config file is 'ipython_config.py', where you can suppress these |
|
423 | To start configuring IPython, do `ipython profile create`, and edit `ipython_config.py` in | |
424 | warnings with `Global.ignore_old_config = True`."""%f) |
|
424 | <ipython_dir>/profile_default."""%f) | |
425 |
|
425 |
@@ -68,7 +68,7 b' controller and engines in the following situations:' | |||||
68 | .. note:: |
|
68 | .. note:: | |
69 |
|
69 | |||
70 | Currently :command:`ipcluster` requires that the |
|
70 | Currently :command:`ipcluster` requires that the | |
71 |
:file:`~/.ipython/ |
|
71 | :file:`~/.ipython/profile_<name>/security` directory live on a shared filesystem that is | |
72 | seen by both the controller and engines. If you don't have a shared file |
|
72 | seen by both the controller and engines. If you don't have a shared file | |
73 | system you will need to use :command:`ipcontroller` and |
|
73 | system you will need to use :command:`ipcontroller` and | |
74 | :command:`ipengine` directly. |
|
74 | :command:`ipengine` directly. | |
@@ -92,7 +92,7 b' Configuring an IPython cluster' | |||||
92 |
|
92 | |||
93 | Cluster configurations are stored as `profiles`. You can create a new profile with:: |
|
93 | Cluster configurations are stored as `profiles`. You can create a new profile with:: | |
94 |
|
94 | |||
95 |
$ ip |
|
95 | $ ipython profile create --cluster profile=myprofile | |
96 |
|
96 | |||
97 | This will create the directory :file:`IPYTHONDIR/cluster_myprofile`, and populate it |
|
97 | This will create the directory :file:`IPYTHONDIR/cluster_myprofile`, and populate it | |
98 | with the default configuration files for the three IPython cluster commands. Once |
|
98 | with the default configuration files for the three IPython cluster commands. Once | |
@@ -133,7 +133,7 b' The mpiexec/mpirun mode is useful if you:' | |||||
133 |
|
133 | |||
134 | If these are satisfied, you can create a new profile:: |
|
134 | If these are satisfied, you can create a new profile:: | |
135 |
|
135 | |||
136 |
$ ip |
|
136 | $ ipython profile create --cluster profile=mpi | |
137 |
|
137 | |||
138 | and edit the file :file:`IPYTHONDIR/cluster_mpi/ipcluster_config.py`. |
|
138 | and edit the file :file:`IPYTHONDIR/cluster_mpi/ipcluster_config.py`. | |
139 |
|
139 | |||
@@ -190,7 +190,7 b' The PBS mode uses the Portable Batch System [PBS]_ to start the engines.' | |||||
190 |
|
190 | |||
191 | As usual, we will start by creating a fresh profile:: |
|
191 | As usual, we will start by creating a fresh profile:: | |
192 |
|
192 | |||
193 |
$ ip |
|
193 | $ ipython profile create --cluster profile=pbs | |
194 |
|
194 | |||
195 | And in :file:`ipcluster_config.py`, we will select the PBS launchers for the controller |
|
195 | And in :file:`ipcluster_config.py`, we will select the PBS launchers for the controller | |
196 | and engines: |
|
196 | and engines: | |
@@ -310,7 +310,7 b' nodes and :command:`ipcontroller` can be run remotely as well, or on localhost.' | |||||
310 |
|
310 | |||
311 | As usual, we start by creating a clean profile:: |
|
311 | As usual, we start by creating a clean profile:: | |
312 |
|
312 | |||
313 |
$ ip |
|
313 | $ ipython profile create --cluster profile=ssh | |
314 |
|
314 | |||
315 | To use this mode, select the SSH launchers in :file:`ipcluster_config.py`: |
|
315 | To use this mode, select the SSH launchers in :file:`ipcluster_config.py`: | |
316 |
|
316 | |||
@@ -417,7 +417,7 b' When the controller and engines are running on different hosts, things are' | |||||
417 | slightly more complicated, but the underlying ideas are the same: |
|
417 | slightly more complicated, but the underlying ideas are the same: | |
418 |
|
418 | |||
419 | 1. Start the controller on a host using :command:`ipcontroller`. |
|
419 | 1. Start the controller on a host using :command:`ipcontroller`. | |
420 |
2. Copy :file:`ipcontroller-engine.json` from :file:`~/.ipython/ |
|
420 | 2. Copy :file:`ipcontroller-engine.json` from :file:`~/.ipython/profile_<name>/security` on | |
421 | the controller's host to the host where the engines will run. |
|
421 | the controller's host to the host where the engines will run. | |
422 | 3. Use :command:`ipengine` on the engine's hosts to start the engines. |
|
422 | 3. Use :command:`ipengine` on the engine's hosts to start the engines. | |
423 |
|
423 | |||
@@ -425,7 +425,7 b' The only thing you have to be careful of is to tell :command:`ipengine` where' | |||||
425 | the :file:`ipcontroller-engine.json` file is located. There are two ways you |
|
425 | the :file:`ipcontroller-engine.json` file is located. There are two ways you | |
426 | can do this: |
|
426 | can do this: | |
427 |
|
427 | |||
428 |
* Put :file:`ipcontroller-engine.json` in the :file:`~/.ipython/ |
|
428 | * Put :file:`ipcontroller-engine.json` in the :file:`~/.ipython/profile_<name>/security` | |
429 | directory on the engine's host, where it will be found automatically. |
|
429 | directory on the engine's host, where it will be found automatically. | |
430 | * Call :command:`ipengine` with the ``--file=full_path_to_the_file`` |
|
430 | * Call :command:`ipengine` with the ``--file=full_path_to_the_file`` | |
431 | flag. |
|
431 | flag. | |
@@ -437,7 +437,7 b' The ``--file`` flag works like this::' | |||||
437 | .. note:: |
|
437 | .. note:: | |
438 |
|
438 | |||
439 | If the controller's and engine's hosts all have a shared file system |
|
439 | If the controller's and engine's hosts all have a shared file system | |
440 |
(:file:`~/.ipython/ |
|
440 | (:file:`~/.ipython/profile_<name>/security` is the same on all of them), then things | |
441 | will just work! |
|
441 | will just work! | |
442 |
|
442 | |||
443 | Make JSON files persistent |
|
443 | Make JSON files persistent | |
@@ -472,7 +472,7 b' Log files' | |||||
472 |
|
472 | |||
473 | All of the components of IPython have log files associated with them. |
|
473 | All of the components of IPython have log files associated with them. | |
474 | These log files can be extremely useful in debugging problems with |
|
474 | These log files can be extremely useful in debugging problems with | |
475 |
IPython and can be found in the directory :file:`~/.ipython/ |
|
475 | IPython and can be found in the directory :file:`~/.ipython/profile_<name>/log`. | |
476 | Sending the log files to us will often help us to debug any problems. |
|
476 | Sending the log files to us will often help us to debug any problems. | |
477 |
|
477 | |||
478 |
|
478 |
@@ -179,7 +179,7 b' describe how to configure and run an IPython cluster on an actual compute' | |||||
179 | cluster running Windows HPC Server 2008. Here is an outline of the needed |
|
179 | cluster running Windows HPC Server 2008. Here is an outline of the needed | |
180 | steps: |
|
180 | steps: | |
181 |
|
181 | |||
182 |
1. Create a cluster profile using: ``ip |
|
182 | 1. Create a cluster profile using: ``ipython profile create --cluster profile=mycluster`` | |
183 |
|
183 | |||
184 | 2. Edit configuration files in the directory :file:`.ipython\\cluster_mycluster` |
|
184 | 2. Edit configuration files in the directory :file:`.ipython\\cluster_mycluster` | |
185 |
|
185 | |||
@@ -198,13 +198,13 b' directory is a specially named directory (typically located in the' | |||||
198 | :file:`.ipython` subdirectory of your home directory) that contains the |
|
198 | :file:`.ipython` subdirectory of your home directory) that contains the | |
199 | configuration files for a particular cluster profile, as well as log files and |
|
199 | configuration files for a particular cluster profile, as well as log files and | |
200 | security keys. The naming convention for cluster directories is: |
|
200 | security keys. The naming convention for cluster directories is: | |
201 |
:file:` |
|
201 | :file:`profile_<profile name>`. Thus, the cluster directory for a profile named | |
202 | "foo" would be :file:`.ipython\\cluster_foo`. |
|
202 | "foo" would be :file:`.ipython\\cluster_foo`. | |
203 |
|
203 | |||
204 | To create a new cluster profile (named "mycluster") and the associated cluster |
|
204 | To create a new cluster profile (named "mycluster") and the associated cluster | |
205 | directory, type the following command at the Windows Command Prompt:: |
|
205 | directory, type the following command at the Windows Command Prompt:: | |
206 |
|
206 | |||
207 |
ip |
|
207 | ipython profile create --cluster profile=mycluster | |
208 |
|
208 | |||
209 | The output of this command is shown in the screenshot below. Notice how |
|
209 | The output of this command is shown in the screenshot below. Notice how | |
210 | :command:`ipcluster` prints out the location of the newly created cluster |
|
210 | :command:`ipcluster` prints out the location of the newly created cluster |
General Comments 0
You need to be logged in to leave comments.
Login now